多重继承的注意点

1, 钻石型多重继承如果不想要底部的类有重复的变量,则需要声明为virtual继承

  class File{...};

  class InputFile: virtual public File{..};

  class OutputFile: virtual public File{....};

  class IOFile: public InputFile,

        public OutputFile

  {...};

2, 多重继承来的成员函数指向一边的指针不能访问另一边的函数

///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   multi_inherit.h
//  Version     :   0.10    created    2013/11/08 00:00:00
//  Author      :   Jimmy Han
//  Comment     :
//
///////////////////////////////////////////////////////////////////////////////
#ifndef MULTI_INHERIT_H
#define    MULTI_INHERIT_H

class base1{
public:
    void baseFunc();
private:
    int baseElem;
};

class derive1 : public base1 {
public:
    void derive1Func();
private:
    int derive1Elem;
};

class base2{
public:
    void baseFunc();
private:
    int baseElem;
};

class derive2 : public derive1, public base2{
public:
    void derive2Func();

    //to avoid ambigous
    void baseFunc();

private:
    int derive2Elem;
};

#endif
///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   multi_inherit.cpp
//  Version     :   0.10
//  Author      :   Ryan Han
//  Date        :   2013/07/26 16:50:14
//  Comment     :
//
///////////////////////////////////////////////////////////////////////////////
#include "multi_inherit.h"

#include <iostream>
using namespace std;

void base1::baseFunc() {
    cout << "base1Func was called. " << endl;
}

void base2::baseFunc() {
    cout << "base2Func was called. " << endl;
}

void derive1::derive1Func() {
    cout << "derive1Func was called. " << endl;
}

void derive2::derive2Func() {
    cout << "derive2Func was called. " << endl;
}

void derive2::baseFunc() {
    base2::baseFunc();
}
///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   multi_inherit_client.cpp
//  Version     :   0.10
//  Author      :   Ryan Han
//  Date        :   2013/07/26 16:50:14
//  Comment     :
//    Output        :
//    $ ./a
// $ ./a.exe
// base2Func was called.
// derive1Func was called.
// derive2Func was called.
// base1Func was called.
// derive1Func was called.

///////////////////////////////////////////////////////////////////////////////
#include "multi_inherit.h"
#include <iostream>
using namespace std;

int main() {
    derive2 d2;
    //if not embed, this will be ambigous and compile error
    d2.baseFunc();
    //could call both derive1Func and derive2Func
    d2.derive1Func();
    d2.derive2Func();

    derive1* b1 = new derive2;
    //call base1 or derive1 functions, OK
    b1->baseFunc();
    b1->derive1Func();
    //call base2 or derive2 functions, compile error.
    //b1->derive2Func();

    return 0;
}

多重继承的注意点

时间: 2024-10-12 15:26:58

多重继承的注意点的相关文章

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