java 虚继承_虚继承的理解以及需要注意的问题

首先需要对虚继承进行了解:(前一篇文章有讲解)

下面的图对一般继承和虚继承很好的解释。一般的继承为Bottom构造时先构造left和right,并且同时为left和right构造各自的Top,这样Bottom中有两个Top。而虚继承Bottom构造时屏蔽了left和right对Top的构造,而是使用自己对Top的构造。

0_13314496324sUz.gif

0_1331449640F08p.gif

下面以一个事例进行分析:

如图为继承关系:

0_1331449648Q55f.gif

A中有成员a

B中有成员b                        经过继承: A:a 和 b

C中有成员c                        经过继承: A:a 和 c

D中有成员d                        经过继承: B:A:a,C:A:a,B:b,C:c和d

E中有成员e                         经过继承: D:B:A:a,D:C:A:a,D:B:b,D:C:c,D:d,e

.h文件省略,以下为cpp文件:

A .cpp

A::A(int a):m_a(a) //构造A

{

}

void A::print()

{

cout << "A中的a" << m_a << endl;

}

B .cpp

B::B(int a, int b):A(a),m_b(b) //构造B,调用A的构造

{

}

void B::print()

{

cout << m_b << "B中b" <

cout << "B中继承的a" << this->m_a << endl;

}

C .cpp

C::C(int a,int c):A(a),m_c(c) //构造C,调用A的构造

{}

void C::print()

{

cout << m_c << "C中c" <

cout << "C中继承A的a" <

}

D.cpp

//构造D,调用A,B,C的构造,因为B,C是虚继承所以这里要调用A的构造函数,否则系统会调用A的默认构造函数,但不会通过B,C去调用A的赋值构造函数

D::D(int a1,int a2,int b,int c, int d):B(a1,b),C(a2,c),A(a2),m_d(d) {}

void D::print()

{

cout << m_d << "D中的d" <

cout << this->m_a << "D中的a" <

cout << this->m_b << "D中的b" <

cout << this->m_c << "D中的c" <

}

E.cpp

//构造E,调用A,D的构造,同样因为B,C是虚继承,所以这里要调用A的构造函数,否则系统会调用A的默认构造函数,但不会通过D去调用A的赋值构造函数,说明虚继承具有传递性

E::E(int a1,int a2,int b,int c,int d,int e):D(a1,a2,b,c,d),A(a1),m_e(e) //调用A构造,D中对A的构造被屏蔽了

{}

void E::print()

{

cout << m_e << "E中的e" <

cout << this->m_a << "E中的a" <

cout << this->m_b << "E中的b" <

cout << this->m_c << "E中的c" <

cout << this->m_d << "E中的d" <

D::print();

B::print();

}

主函数:

#include "stdafx.h"

#include

#include "E.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

E e(1,2,3,4,5,6);

e.print();

/*D d(1,2,3,4,5);

d.print();*/

//B *d = new D(1,2,3,4,5);

//d->print();

system("pause");

return 0;

}

0_1331450884IGlM.gif        足以见得,B,D,E中的a值都一样,在虚继承的过程中,其实是在派生类中添加了一个指针,指向基函数的成员。

0_13314521652TI5.gif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值