1

我正在经历钻石问题,并认为可以在各种情况下工作。这是我正在研究的其中之一。

#include <iostream> 
using namespace std;
class MainBase{

    public:
    int mainbase;
    MainBase(int i):mainbase(i){}
    void geta()
    {
        cout<<"mainbase"<<mainbase<<endl;
    }
};
class Derived1: public MainBase{

    public:
    int derived1;
    int mainbase;
    Derived1(int i):MainBase(i),derived1(i) {mainbase = 1;}
    public:
    void getderived1()
    {
        cout<<"derived1"<<derived1<<endl;
    }

};
class Derived2: public MainBase{

    public:
    int derived2;
    int mainbase;
    Derived2(int i):MainBase(i),derived2(i){mainbase = 2;}
    public:
    void getderived2()
    {
        cout<<"derived2"<<derived2<<endl;
    }
};
class Diamond: public Derived1, public Derived2{

    public:
    int diamond;
    int mainbase;
    Diamond(int i,int j, int x):Derived1(j),Derived2(x),diamond(i){mainbase=3;}
    public:
    void getdiamond()
    {
        cout<<"diamond"<<diamond<<endl;
    }
};
int main()
{
    Diamond d(4,5,6);
//    cout<< d.MainBase::mainbase;
    cout<<"tested"<<endl;
    cout<<d.mainbase;
    cout<<d.Derived2::mainbase<<endl;
    cout<<d.Derived1::mainbase<<endl;
    /*cout<<d.Derived2::MainBase::mainbase<<endl;
    cout<<d.Derived1::MainBase::mainbase<<endl;*/
}

我现在想知道如何访问 MainBase 类 mainbase 变量?任何输入。

4

3 回答 3

5

你做你在那里做过的事情:

cout<<d.Derived2::MainBase::mainbase<<endl;
cout<<d.Derived1::MainBase::mainbase<<endl;

但是,它可能无法达到您想要达到的效果。可能,您应该使用virtual继承?您所拥有的意味着您的对象中将有两个MainBase成员副本,一个用于每个继承轨道。

(来自 MSDN)。

当基类被指定为虚拟基类时,它可以多次充当间接基类,而不会重复其数据成员。其数据成员的单个副本由使用它作为虚拟基的所有基类共享。

可能这样的事情会更适合你:

class Derived1: virtual public MainBase{
于 2009-08-12T05:33:35.373 回答
2

您的代码无法编译,在将 Mainbase 称为 Diamond 实例的基础时存在歧义。您需要在派生类(Derived1、Derived2)中使用virtual来解决这种歧义,方法是允许它们共享基类的单个实例,如下所示:

class Derived1: virtual public Mainbase {
/* do your thing here*/
};
于 2009-08-12T05:34:54.137 回答
0

您应该能够从Diamond类中像这样访问它:

Diamond::foo() {
    Mainbase::mainbase = 0;
}

假设您的代码首先正确编译。有关编译的更多信息,请参阅Michael Foukarakis 的 回答。另外,请参阅 DDJ 的这篇优秀文章:“Multiple Inheritance Considered Useful”,了解如何正确执行此操作。

于 2009-08-12T05:33:27.447 回答