c++继承--这就是c++里面最有魅力的东西

Posted Heisenberg_Posion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++继承--这就是c++里面最有魅力的东西相关的知识,希望对你有一定的参考价值。

文章目录

1.继承的应用——为什么要用继承

类与类之间存在着关系,比如说鱼这个类,下级里有草鱼,青鱼等等,然后每种鱼都有它自己的一些特性,定义这些类时,发现下级别的成员除了拥有上一级的共性,还有自己的特性。这时可以用继承的技术来减少重复的代码。

#include<iostream>
using namespace std;


//继承的语法:
// class 子类 :public 父类   子类也可以称为派生类,父类也可以称为基类
//子类中的属性有继承过来的,还有自己增加的成员
class dog

public:
	int m_age = 0;
	int m_height = 15;
	void printMessage()
	
		cout << m_age << " " << m_height << endl;
	
;

class dog_X :public dog

public:
	int m_radious = 50;
	void printfMe()
	
		cout << m_radious << endl;
	
;

int main()

	dog_X sj;
		sj.printfMe();
		sj.printMessage();
		return 0;


2.继承方式

根据属性权限可以分为,公共继承,保护继承,私有继承。
首先知道无论哪种继承方式,都不能继承父类的私有权限属性。
这里说明一下这里的不能继承是指不可见,虽然确确实实被继承过来了,但我们不能访问,所以我写成了不能继承。
公共继承,子类继承父类的各个属性的权限不变。
保护继承,子类继承父类的公共权限变为保护权限,保护权限不变。
私有继承,子类继承父类的公共权限和保护权限都变为私人权限。

#include<iostream>
using namespace std;

class father

public:
	int m_apple;
protected:
	int m_watermelon;
private:
	int m_pear;

;

class son1 :public father  //继承语法

	void func()
	
		m_apple = 10;
		m_watermelon = 20;
		//m_pear =30  没有继承到父类中的私人权限
	
;

3.继承中的对象模型

虽然继承不到父类的私人权限,但是子类的对象模型里面会有父类的所有非静态成员属性,父类中的私有成员权限是被编译器隐藏了,但是确实是继承下去了,新建对象的空间大小就得考虑这个。

4.继承中的构造和析构顺序

创建一个子类的对象时,也会调用父类的构造函数

先构造父类,然后构造子类,生活常识,先有父亲,再有儿子。
再记住析构顺序与构造相反。

5.继承中父类和子类同名成员的处理

子类对象下访问子类的属性,直接访问就好了,如果要访问父类中的同名属性,加上作用域就好了。

当子类与父类拥有同名的成员函数,子类会隐藏父类中所有版本的同名成员函数
如果想访问父类中被隐藏的同名成员函数,需要加父类的作用域

这两种处理方式很容易理解,如果我要调用一个函数,如果我自己有的话,我就不会去我继承的那个地方去找。

6.继承同名静态成员处理方式

和非静态成员处理方式是一致的。

class Base 
public:
	static void func()
	
		cout << "Base - static void func()" << endl;
	
	static void func(int a)
	
		cout << "Base - static void func(int a)" << endl;
	

	static int m_A;
;

int Base::m_A = 100;

class Son : public Base 
public:
	static void func()
	
		cout << "Son - static void func()" << endl;
	
	static int m_A;
;

int Son::m_A = 200;

//同名成员属性
void test01()

	//通过对象访问
	cout << "通过对象访问: " << endl;
	Son s;
	cout << "Son  下 m_A = " << s.m_A << endl;
	cout << "Base 下 m_A = " << s.Base::m_A << endl;

	//通过类名访问
	cout << "通过类名访问: " << endl;
	cout << "Son  下 m_A = " << Son::m_A << endl;
	cout << "Base 下 m_A = " << Son::Base::m_A << endl;


//同名成员函数
void test02()

	//通过对象访问
	cout << "通过对象访问: " << endl;
	Son s;
	s.func();
	s.Base::func();

	cout << "通过类名访问: " << endl;
	Son::func();
	Son::Base::func();
	//出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作作用域访问
	Son::Base::func(100);

int main() 

	//test01();
	test02();

	system("pause");

	return 0;

总结:同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)


## 7.多继承

**一个类继承多个类**

语法:class 子类 :继承方式 父类1 , 继承方式 父类2...
多继承可能会引发父类中有同名成员出现,需要加作用域区分,不太使用多继承



以上是关于c++继承--这就是c++里面最有魅力的东西的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象--继承

C++ 无虚函数的单继承内存模型

C++继承

C++虚基类表指针字节对齐模型

是否建议让所有类都从 C++ 中的基类继承?

C++中的继承详解