重读深度探索C++对象模型:虚函数

1.单一继承下的虚函数(待更新)

2.多重继承下的虚函数

多重继承讲给虚函数带来很大的问题,主要有三点:

1.虚析构函数:

  析构函数一般都是虚函数,不然删除某个指向派生类的基类指针将不会析构派生类的内容。

首先关于多重继承:

如以下这个关系:

A与B同级,C分别继承这两个类。

如果A* a=new C;

B* b=new C;

则通过a只能调用displayA();

通过b只能调用displayB();

也就是说b->displayA()这样是非法的。

然后是关于多重继承对虚析构函数的影响。

现在A是基类中最左边的类,如果我们

A* a=new C;

现在a指向的实际上是现在这个对象地址的最起始处,而如果我们

B* b=new C;

现在b指向的起始是类中B subobject处,也就是说使用B类作为基类指针的话指向的不是起始处。

但是当我们调用析构函数时,比如delete b时,此时应该将b再调整至类的起始地址处

在单一继承时候是不存在这个问题的,因为只有一个基类,指针也一直指向类的起始地址,而当加入多重继承且经由非最左边的类的指针来delete时,需要在delete前将指针在调整至类的起始处,因为一开始b并不是指向起始,而是指向B subobject处的。

class A
{
public:
	virtual ~A()
	{
		cout<<"a bybye"<<endl;
	}
	virtual void displayA()
	{
		cout<<"a"<<endl;
	}
};
class B
{
public:
	virtual ~B()
	{
		cout<<"b byebye"<<endl;
	}
	virtual void displayB()
	{
		cout<<"b"<<endl;
	}
};
class C:public A,public B
{
public:
	~C()
	{
		cout<<"c bye bye"<<endl;
	}
};

  

转载于:https://www.cnblogs.com/lxy-xf/p/11378929.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值