2009-08-12 169 views
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变量?任何输入。

+0

修复代码,请。全部选中并点击010101. – jkeys 2009-08-12 05:12:09

+0

确实,这是一场噩梦。 :( – 2009-08-12 05:13:20

+1

钻石问题:“在与多重继承和知识组织的面向对象编程语言中,该钻石的问题是,当出现两个类B和C从A继承歧义,和类d从B和C,如果继承D中的一个方法调用A中定义的方法(并且不覆盖该方法),并且B和C以不同方式重写该方法,那么它从哪个类继承:B或C?“source:http:// en .wikipedia.org/wiki/Diamond_problem – Adriaan 2009-08-12 07:36:05

回答

5

你做你所做的事有:

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

但是,它可能不是你要实现的目标是什么。可能的话,你应该使用virtual继承?你有什么意思就是说你的对象中有两个MainBase成员的副本,每个继承轨道一个。

(来自MSDN)。

当一个基类被指定为 虚拟的基础上,它可以作为除一旦 间接基更起作用,而不重复 它的数据成员的。它的数据成员的 单个副本 由所有 使用它作为一个虚拟基的基类共享。

也许这样的事情会更适合你:

class Derived1: virtual public MainBase{ 
+0

@ 1800信息谢谢 – Lakshmi 2009-08-12 05:46:32

0

您应该能够从Diamond类访问它是这样的:

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

假设你的代码在第一时间正确编译。有关编译的更多信息,请参阅Michael Foukarakis'answer。另外,请参阅DDJ的优秀文章:"Multiple Inheritance Considered Useful",了解如何正确执行此操作。

2

您的代码将无法编译,指Mainbase作为钻石实例的基础时出现混淆。你需要让他们分享基类的一个实例,像这样使用在派生类(Derived1,Derived2的)虚拟来解决这种不确定性:

class Derived1: virtual public Mainbase { 
/* do your thing here*/ 
};