C++的多重继承

C++允许多重继承,多重继承是C++与其他一些流行语言不同的一个地方。比如在JAVA中就不存在多重继承,为此,当涉及到类似C++多重继承的场景时,JAVA之类的语言都使用“接口”的形式来实现目的,在C++里是没有接口的概念的,对应需求的使用对虚基类的多重继承来实现。下面就整理一下多重继承的基本用法和几个注意事项。

  • 基类
class Base
{
public:
    int baseInt;
};
  • 继承自基类的两个并列的类
clase Left : public Base
{
    Left() : Base()    //注意要继承基类构造函数
    {
    }
};
clase Right : public Base
{
    Right() : Base()    //注意要继承基类构造函数
    {
    }
};
  • 多重继承上面两个类
clase Multi : public Left, public Right
{
    Multi() : Base(), Left(), Right()    //继承所有基类构造函数
    {
    }
};

【注意】

上述多重继承方法的逻辑结构如下:

Multi中会有重复的Base成员baseInt,当使用到该变量的时候会产生歧义而不通过编译

解决方法:

Left和Right继承Base时,使用virtual继承(这个virtual和虚函数无任何关系),类似下面这样:

clase Left : virtual public Base

【注意】

当使用Left* left指向一个Multi对象时,如果想使用从Right继承过来的变量或函数,我们会需要将这个Left类型的指针转换成一个Right型的指针,此时:

Right* right = (Right*)left;    //错误

Right* right = dynamic_cast<Right*>(left);    //正确,此时由于Left与Right在继承机构中是平级关系,该转换也成为交叉转换

原因:

由于继承过来的各种virtual函数,Multi对象中会对应每个直接继承的基类都维护一个vtable(这个部分请搜索这几个关键字去了解:virtual函数、动态绑定、运行时多态),按照继承的循序排列,vtable中保存从对应基类继承过来的函数的地址;直接强制转换会导致查错vtable

时间: 2024-10-06 10:22:01

C++的多重继承的相关文章

016: class and objects &gt; 多重继承与多态的例子

房屋代理模型: 1. Property class Property(object): def __init__(self, square_feet='', num_bedrooms='', num_baths='', **kwargs): super().__init__(**kwargs) self.square_feet = square_feet self.num_bedrooms = num_bedrooms self.num_baths = num_baths def display

C++多重继承中构造函数和析构函数调用顺序举例

//多重继承 #include <iostream> using namespace std; class A { public:     A()     {         cout<<"A基类构造A::A()"<<endl;     }     ~A()     {         cout<<"A基类析构A::~A()"<<endl;     } }; class B:public A { publi

C++多重继承关系举例

//多重继承 #include <iostream> using namespace std; class A { public:     int a;     A(int a=0):a(a)     {         cout<<"A基类A::A()"<<endl;     }     ~A()     {         cout<<"A基类A::~A()"<<endl;     }     void

C++多重继承中的虚继承和虚函数举例

上一篇虚继承举例:http://10638473.blog.51cto.com/10628473/1964414 本文将A类中的show()函数前加上virtual关键字. //多重继承 #include <iostream> using namespace std; class A { public:     int a;     A(int a=0):a(a)     {         cout<<"A基类A::A()"<<endl;     

Java提高篇——Java实现多重继承

阅读目录 一. 接口二.内部类 多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需要思考的不是怎么使用多重继承,而是您的设计是否存在问题.但有时候我们确实是需要实现多重继承,而且现实生活中也真正地存在这样的情况,比如遗传:我们即继承了父亲的行为和特征也继承了母亲的行为和特征.可幸的是Java是非常和善和理解我们的,它提供了两种方式让我们曲折来实现多

JS---原型继承和多重继承

概念: 1.原型继承是创建新类型对象----子类型,子类型基于父类型,子类型拥有父类型所有的属性和方法(从父类型继承得到),然后修改其中的部分内容或者添加新的内容.继承最好在子类型模型可以被视为父类型对象的时候使用. 2.从多个父类型中派生出一个对象类型称为多重继承. 一.原型继承 使用new关键字和构造函数的prototype属性都是定义类型的特定方式,这些是我们到目前为止一直使用的,对于简单的对象,这种方式还是很好的,但是当程序过度使用继承时,这种创建对象的方法很快就显得笨拙了.所以增加一些

多重继承,虚继承,MI继承中虚继承中构造函数的调用情况

先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: [cpp] view plain copy print? //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base()

第53课 被遗弃的多重继承(上)

1. 单一继承 (1)实验代码 #include <iostream> #include <string> using namespace std; void visitVtbl(int **vtbl) { cout << vtbl << endl; cout << "\t[-1]: " << (long)vtbl[-1] << endl; typedef void (*FuncPtr)(); int

C++之多重继承

大多数应用程序使用单个基类的公用继承,但是在某些情况下,单继承是不够的,必须使用多继承.C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承. 举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性.如下图示: 代码实现: //多重继承 #include <iostream> using namespace std; class Vehicle { public: Vehicle(int weight = 0) { V

php通过接口实现多重继承

php是单重继承的.一个类只有一个父类. 但是可以通过接口实现多重继承. 定义了一个接口,接口中有方法,假如接口给类去implements了,那么那个类需要有接口的方法.就像下面的代码 <?php interface d{ function b(); } class a implements d{ function b(){} } ?> 但是,如果a的类里面没有function b,就会报错 Fatal error: Class a contains 1 abstract method and