C++多继承和虚基类
2010-03-17 09:03
204 查看
本文属学习笔记,如有错误,欢迎拍砖!
在上一篇《C++和Java的多继承》中我们说到了c++多继承中如果子类D的父类中有两个或两个以上(如父类B,C)又继承自一个类(如A,那么在子类D中访问继承得来的属性(如A类的一些属性)就会出现歧义。上一篇讲的是用作用域访问符来处理这个问题,现在我们要用虚基类来搞定它.
首先我们要知道什么是虚基类:虚基类的基本原则是在内存中只有基类成员的一份拷贝。不止一次地通过多个路径继承类在内存中创建了基类成员的多份拷贝,这样通过把基类继承声明为虚拟的,只继承基类的一份拷贝。那么就要用到virtual限定符把基类继承说明为虚拟的。我们可以把上一篇的程序修改一下得到下面的程序:
#include<iostream>
using namespace std;
class A{
public:
int iVarA;
};
class B:virtual public A{//注意这里
public:
int iVarB;
};
class C:virtual public A{
public :
int iVarC;
};
class D:public B,public C{
public:
int iVarD;
};
int main(){
D Dtemp;
Dtemp.iVarA = 10;
return 0;
}
在上一篇《C++和Java的多继承》中我们说到了c++多继承中如果子类D的父类中有两个或两个以上(如父类B,C)又继承自一个类(如A,那么在子类D中访问继承得来的属性(如A类的一些属性)就会出现歧义。上一篇讲的是用作用域访问符来处理这个问题,现在我们要用虚基类来搞定它.
首先我们要知道什么是虚基类:虚基类的基本原则是在内存中只有基类成员的一份拷贝。不止一次地通过多个路径继承类在内存中创建了基类成员的多份拷贝,这样通过把基类继承声明为虚拟的,只继承基类的一份拷贝。那么就要用到virtual限定符把基类继承说明为虚拟的。我们可以把上一篇的程序修改一下得到下面的程序:
#include<iostream>
using namespace std;
class A{
public:
int iVarA;
};
class B:virtual public A{//注意这里
public:
int iVarB;
};
class C:virtual public A{
public :
int iVarC;
};
class D:public B,public C{
public:
int iVarD;
};
int main(){
D Dtemp;
Dtemp.iVarA = 10;
return 0;
}
相关文章推荐
- C++虚继承、虚基类、虚函数与纯虚函数的概念和引用
- C++虚继承和虚基类
- C++ 虚继承对基类构造函数调用顺序的影响
- C++继承中基类和派生类之间指针传递问题
- C++ 由虚基类 虚继承 虚函数 到 虚函数表
- C++多重继承与虚基类
- C++ 虚基类、虚继承
- C++之虚拟继承和虚基类
- C++中继承覆写导致基类的成员不可见
- 【c++】实例演示类继承中派生类到基类的转换及虚函数
- C++继承之多重继承与虚基类
- C++继承之基类与派生类的转换
- C++虚继承与虚基类的本质
- C++多继承中重写不同基类中相同原型的虚函数
- c++-虚拟继承、虚基类
- [C++]虚基类,解决多继承造成的二义性
- C/C++日常学习总结(第三篇)不能重载的运算符和不同基类继承产生的二义性
- C++继承基类与子类中的同名变量与同名函数
- 【C++】通过基类的指针变量访问派生类中由基类继承来的隐藏对象
- 22、C++中的虚继承以及虚基类