关于虚继承需要注意的几个问题

1、在普通继承中,Derived和Base的关系是Derived is a Base, 在虚继承中,Derived和Base的关系是Derived has a Base

2、static_cast不能用于虚继承时的下行转换

3、虚基类的派生类(包括直接派生类或者间接派生类,下面示例中的B为直接派生类,C为间接派生类)的构造函数初始化列表必须显式调用虚基类的构造函数,除非虚基类有默认构造函数,或者带有默认参数的构造函数这一点与普通继承不同。普通继承中,派生类构造函数初始化列表不用关心父类的父类的构造函数(准确的说,在普通继承中C的构造函数初始化列表不能调用A的构造函数,而虚拟继承,则C必须调用,无论是显式的调用还是隐式的调用)。


请看下面的示例程序

#include <stdio.h>
#include <tchar.h>
#include <string>
#include <ctime>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;

struct A{
	A():price(20000){cout<<"A()"<<endl;}
	A(double b):price(1.1*b){cout<<"A(double)"<<endl;}
	double price;
};
struct B: public virtual A{
	B(double b):A(b){cout<<"B(double)"<<endl;}
};
struct C:public B{
	//这里C作为A的间接派生类必须显式调用A的构造函数,
	//否则编译不能通过
	//如果把B改为struct B: public A{...},则派生类C不必关心A的构造
	//这里没有显式调用A的构造函数
	//那么系统实际上调用的是A()而非A(double)
	C(double b):B(b){}
};


int _tmain(int argc, _TCHAR* argv[])
{
	A *pA = new C(10000);//调用的是A()
	B *pB;
	//compile error 不能将“A*”转换为“B*”;暗含了从虚拟基类的转换
	//pB = static_cast<B*>(pA); 

	//compile error “A”不是多态类型 
	//pB = dynamic_cast<B*>(pA);

	pB = new B(10000);//调用的是A(double)
	pA = static_cast<A*>(pB); //compile OK
	pA = dynamic_cast<A*>(pB); //compile OK
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值