C++中虚拟继承问题
2017-12-26 23:36
204 查看
#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++中虚拟继承:
为了解决从不同路径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致的问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。
这样就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
与虚函数的关系: 虚拟继承与虚函数有一定相似的地方,但它们之间是绝对没呀任何联系的。
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++ 非虚拟继承可以正常使用,虚拟继承后执行的问题
- C++虚拟继承问题
- c++多重继承下虚函数的this指针问题
- 关于虚拟目录继承根Web.Config的问题解决办法
- C++菱形继承和菱形虚拟继承
- 关于C++多继承问题小记
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
- 虚拟继承C++
- 【C++继承】之虚拟继承、作用域
- C++中继承技术引发的问题:重载(overload),覆盖(override)和隐藏(hide)的区别
- java/c++钻石问题(菱形继承问题) 虚继承
- 关于C++中的虚拟继承的一些总结
- C++继承问题(白兰花例)
- 关于C++中的虚拟继承的一些总结
- C++多继承中二义性问题--虚基类
- C++中关于虚拟继承的一些总结
- 关于C++中私有继承后虚函数的访问权限与私有继承后多态的问题
- C++多重继承下的函数动态绑定问题分析
- 关于C++中的虚拟继承的一些总结
- C++中 public和private派生类继承问题和访问权限问题