什么是虚继承?虚基类?
2012-10-15 17:08
169 查看
虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。
类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况:
A A
\ /
B C
\ /
D
而类D中会出现两次A。为节省内存空间,可以将B、C对A的继承定义为虚拟继承,而A就成了虚拟基类。最后形成如下图所示情况:
A
/ \
B C
\ /
D
代码如下:
class A;
class B:public virtual A;
class C:public virtual A;
class D:public B,public C;
例子1:
class A
{
.
.
.
public:
int a;
.
.
.
};
class B:virtual public A
{
.
.
.
};
class C:virtual public A
{
.
.
.
};
class D:public B,public C
{
public:
void f(int i)
{
a=i;
}
};
此例中,对于类D而言,类A是类C的虚基类,是类B的真基类;但对于类C而言,类A仍是类C的真基类,虚基类只是一个相对的概念。
如果把上例子稍稍修改一下:
.
.
.
class D:pbulic C,public B
.
.
.
则对于类D而言,类A是类B的虚基类,是类C的真基类。
#######################################
一个派生类对象的地址可以直接赋给虚基类的指针,不需要强制类型转换。例如:
D obj1;
A *ptr=&obj1;
并且,一个虚基类的引用可以引用一个派生类的对象,反之则不行,无论在强制类型转换中指定什么路径,一个虚基类的指针或引用不能转换为派生类的指针或引用。例如:
D obj2;
A &ref=obj2;
类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况:
A A
\ /
B C
\ /
D
而类D中会出现两次A。为节省内存空间,可以将B、C对A的继承定义为虚拟继承,而A就成了虚拟基类。最后形成如下图所示情况:
A
/ \
B C
\ /
D
代码如下:
class A;
class B:public virtual A;
class C:public virtual A;
class D:public B,public C;
例子1:
class A
{
.
.
.
public:
int a;
.
.
.
};
class B:virtual public A
{
.
.
.
};
class C:virtual public A
{
.
.
.
};
class D:public B,public C
{
public:
void f(int i)
{
a=i;
}
};
此例中,对于类D而言,类A是类C的虚基类,是类B的真基类;但对于类C而言,类A仍是类C的真基类,虚基类只是一个相对的概念。
如果把上例子稍稍修改一下:
.
.
.
class D:pbulic C,public B
.
.
.
则对于类D而言,类A是类B的虚基类,是类C的真基类。
#######################################
一个派生类对象的地址可以直接赋给虚基类的指针,不需要强制类型转换。例如:
D obj1;
A *ptr=&obj1;
并且,一个虚基类的引用可以引用一个派生类的对象,反之则不行,无论在强制类型转换中指定什么路径,一个虚基类的指针或引用不能转换为派生类的指针或引用。例如:
D obj2;
A &ref=obj2;
相关文章推荐
- 什么是虚继承?虚基类?
- Exception和继承自Exception的RuntimeException有什么区别
- 2018/01/08JAVA 基础 / 接口与继承/Object类——[思考?question:Object类的方法有什么用?为什么不直接在类中设计方法?
- c#实例 让你明白什么是继承
- 什么类要继承于IDisposable呢
- 面向对象的基本特征是什么?什么是封装、继承、多态?
- 第十一章[2]:多继承中二义性的解决方案(类名+虚基类)
- asp.net 中类,继承,抽象类,接口的定义方法?还有区别是什么?
- java中类继承,到底继承了什么?
- 继承是什么?
- 继承与组合有什么区别
- 子进程自父进程继承什么或未继承什么
- 什么情况该继承
- 29.C++类的多重继承——虚基类
- 什么是原型继承
- 对为什么使用访问器(getter),以及什么是继承的一点看法
- 什么是继承
- C++(笔记)浅谈什么是继承机制
- 用组合取代继承能为 Activity 带来什么