#include<iostream>
using namespace std;
class A{
public:
A(char *s) {
cout<<s<<endl;
}
~A(){}
};
class B: virtual public A {
public:
B(char *s1,char *s2):A(s1){
cout<<s2<<endl;
}
};
class C:virtual public A {
public:
C(char *s1,char *s2):A(s1) {
cout<<s2<<endl;
}
};
class D:public B,public C {
public:
D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s1,s3),A(s1) {
cout<<s4<<endl;
}
};
int main() {
D *p=new D("class A","class B","class C","class D");
delete p;
return 0;
}
C++对象生成时的构造顺序问题,先构造继承过来的父类,然后同级按顺序构造,算下来顺序就是abcd,虚继承解决继承二义性问题。
对于D继承了BC,加上virtual之后,系统会自动加入一个虚拟继承的拷贝,首先调用虚拟基类的构造函数,之后就不会打印了。如果不加virtual的话,应该会打印两次的基类的构造函数。
-------------------------------------------------------
C++中虚拟继承:
为了解决从不同路径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致的问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。
这样就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
与虚函数的关系: 虚拟继承与虚函数有一定相似的地方,但它们之间是绝对没呀任何联系的。
标签:继承,C++,虚拟,内存,基类,拷贝 From: https://blog.51cto.com/u_14939782/6467640