多重继承、钻石继承、虚继承
1、多重载继承
在C++中一个子类可以有多个父类,在继承表中按照顺序继承多个父类中的属性和行为,并按照顺序表,调用父类的构造函数。
按照从低到高的地址顺序排序父类,子类中会标记每个父类存储位置。
当子类指针转换成父类的隐式指针时候,编译器会自动计算父类中的内容在子类中的位置,地址会自动进行偏移计算。
2、名字冲突
如果父类中有同名的成员,可以正常继承,但如果直接使用,会造成歧义,需要 类名::成员名 进行访问。
3、钻石继承
假如有一个类A,类B继承类A,类C也继承类A,类D继承B和C。
一个子类继承多个父类,这些父类有一个共同的祖先,这种继承叫钻石继承。
注意:钻石继承不会导致继承错误,但访问祖先类中的成员时每次需要使用 类名::成员名 ,重点是这种继承会造成冗余。
4、虚继承 virtual
当进行钻石继承时,祖先类中的内容会有冗余,而进行虚继承后,在子类中的内容只会保留一份。
注意:但使用虚继承时,子类中会多了一些内容(指向从祖先类继承来的成员)。
#include <iostream>
#include <stdio.h>
using namespace std;
class A
{
public:
int a;
};
class B:virtual public A{};
class C:virtual public A{};
class D:public B,public C{};
int main()
{
cout<< sizeof(B)<<endl;
B* p = new B;
p->a = 100;
A* ap = p;
A* ap1 = new C;
ap1->a = 111;
printf("%d %d\n",*(int*)ap,*(int*)ap1);
// printf("%d\n",*((int*)p+1));
// printf("%p %p\n",p,ap);
}
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!