第三十六节 C++ 菱形问题的解决 -- 虚继承

原创 2018年04月16日 13:18:59

菱形问题:三个派生类同时继承一个基类,又存在另一个派生类同时继承这三个派生类。这将导致创建三个基类对象(calss One),当我们通过Three去调用One的函数实现时, 将出现错误,编译器不知道调用哪个One的函数,这将是我们不愿意发生的。

#include <iostream>
using namespace std;

class One {
public:
	One() { cout << "One constructor" << endl; }
};

/*创建两个对象*/
class Two_1 : public One {
public:
	Two_1() { cout << "Two_1 constructor" << endl; }
};

/*创建两个对象*/
class Two_2 : public One {
public:
	Two_2() { cout << "Two_2 constructor" << endl; }
};

/*创建两个对象*/
class Two_3 : public One {
public:
	Two_3() { cout << "Two_3 constructor" << endl; }
};

/*多继承*/
class Three : public Two_1, public Two_2, public Two_3 {
public:
	Three() { cout << "Three constructor" << endl; }
};

int main()
{
	Three Object; //实例化对象,实例化了三次One类,从输出可以看出
	return 0;
}

output: 

One constructor      //实例化一次
Two_1 constructor
One constructor    //实例化两次
Two_2 constructor
One constructor      //实例化三次
Two_3 constructor

Three constructor

可以用虚继承解决上述问题。

-------------------------------------------------------------------------------------------

#include <iostream>
using namespace std;

class One {
public:
	One() { cout << "One constructor" << endl; }
};

class Two_1 : virtual public One {
public:
	Two_1() { cout << "Two_1 constructor" << endl; }
};

class Two_2 : virtual public One {
public:
	Two_2() { cout << "Two_2 constructor" << endl; }
};

class Two_3 : virtual public One {
public:
	Two_3() { cout << "Two_3 constructor" << endl; }
};

/*多继承*/
class Three : public Two_1, public Two_2, public Two_3 {
public:
	Three() { cout << "Three constructor" << endl; }
};

int main()
{
	Three Object; //实例化对象,仅实例化一个One类的对象,从输出可以看出
	return 0;
}

output:

One constructor
Two_1 constructor
Two_2 constructor
Two_3 constructor
Three constructor

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dddd0216/article/details/79959337

【C++基础之二十一】菱形继承和虚继承

菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之于接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口。在多重继承中建议使用“接口”,来避免多重继承中可能...
  • jackyvincefu
  • jackyvincefu
  • 2014-01-05 09:05:41
  • 11050

C++继承和菱形继承中的虚继承

(1)C++继承概念: C++继承分为公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。在C++语言中,一个派生类可以从一个基类派生,也可以从多...
  • yx20130919
  • yx20130919
  • 2016-06-17 12:17:57
  • 503

C++菱形继承与虚继承

虚继承,菱形继承
  • xiaolewennofollow
  • xiaolewennofollow
  • 2016-08-14 12:20:18
  • 931

C++ 虚函数 单一继承 多重继承 单一虚继承 菱形虚继承 的简洁总结

虚函数所谓虚函数,从其功能上来看是采用虚调用的方式;当子类重新定义其父类的虚函数以后,父类指针根据付给他的不同子类指针,动态地调用属于子类的该函数;假如一个类有虚函数,则该类会因为维护该虚函数,而额外...
  • misol
  • misol
  • 2011-07-13 21:07:35
  • 3241

C++继承详解之三——菱形继承+虚继承内存对象模型详解vbptr(1)

在我个人学习继承的过程中,在网上查阅了许多资料,这些资料中有关菱形继承的知识都是加了虚函数的,也就是涉及了多态的问题,而我在那个时候并没有学习到多态这一块,所以看很多资料都是云里雾里的,那么这篇文章我...
  • lixungogogo
  • lixungogogo
  • 2016-04-12 14:47:01
  • 3675

C++(笔记)浅析菱形继承&虚继承底层内存占用

一、什么是菱形继承二、代码实现#include   #include   #include   #include #include #include #include using namesp...
  • w_linux
  • w_linux
  • 2017-05-04 11:09:54
  • 560

带有虚函数的菱形继承和带有虚函数的菱形虚继承

对于某些函数来说,基类希望它的派生类定义适合自身的版本,此时基类就将这些函数声明为虚函数。 在存在虚函的类,创建对象时会产生虚表指针,虚表指针指向一个虚表,这时就可以通过虚表访问自己定义的函数。 ...
  • D_leo
  • D_leo
  • 2017-04-12 19:10:11
  • 698

菱形继承和菱形虚继承

继承是C++的一大特点,我们通过菱形继承和菱形虚继承对继承进行进一步的分析。 【菱形继承】 创建一个基类A让B1和B2公有继承于它,让C公有继承B1和B2。 class A { public :...
  • D_leo
  • D_leo
  • 2017-04-08 09:05:03
  • 317

【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)

c++单继承、多继承、菱形继承内存布局(虚函数表结构)
  • SuLiJuan66
  • SuLiJuan66
  • 2015-10-04 18:44:28
  • 3508

C++ Primer 有感(多重继承与虚继承)

1.多重继承的构造次序:基类构造函数按照基类构造函数在类派生列表中的出现次序调用,构造函数调用次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响。2.在单...
  • ctthunagchneg
  • ctthunagchneg
  • 2013-07-01 14:53:51
  • 1333
收藏助手
不良信息举报
您举报文章:第三十六节 C++ 菱形问题的解决 -- 虚继承
举报原因:
原因补充:

(最多只允许输入30个字)