您的位置:首页 > 其它

菱形继承

2016-01-22 07:58 495 查看
/// @file test_class.c
/// @brief 菱形继承的测试
/// 菱形继承是指一个类多继承于2个基类, 2个基类单继承于一个顶层基类
/// 如果子类调用顶层基类的方法,会出现2义性, 编译不过

#include <stdlib.h>
#include <stdio.h>

class CA {
public:
    CA() : iA(1) {}
    virtual ~CA() {}

    int getDataCA() {return iA;}

    int iA;
};

/// 子类的直接基类虚继承于顶层基类
class CBL : virtual public CA {
public:
    CBL() : iB(2) {}
    virtual ~CBL() {}
    int getData() {return iB;}

    int iB;
};

/// 子类的直接基类虚继承于顶层基类
class CBR : virtual public CA {
public:
    CBR() : iB(2) {}
    virtual ~CBR() {}
    int getData() {return iB;}
    
    int iB;
};

class CC : public CBL, public CBR {
public:
    CC() : iC(3) {}
    virtual ~CC() {}

    int iC;
};

void fnTest()
{
    CC a;

    /** 解决方法1 : 指定作用域, 只能用于直接基类中有相同方法的问题 */
    // error C2385: 'CC::getData' is ambiguous
    // a.getData(); ///< 菱形继承问题, 指定作用域后ok
    a.CBL::getData(); ///< 如果多个直接基类中有相同方法,才可以指定方法的作用域
    a.CBR::getData(); ///< 如果多个直接基类中有相同方法,才可以指定方法的作用域

    /** 解决方法2 : 不是直接基类中的函数, 必须用虚继承来解决菱形继承问题. */
    // error C2385: 'CC::getDataCA' is ambiguous
    a.getDataCA(); ///< 菱形继承问题, 子类的直接基类都虚继承顶层基类后ok
}

int main(int argc, char *argv[])
{
    fnTest();
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: