-
13-09-2019 - |
题
我正在研究钻石问题,并且认为它适用于各种场景。这就是我正在研究的其中之一。
#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 变量?任何输入。
解决方案
您做你做了什么有:
cout<<d.Derived2::MainBase::mainbase<<endl;
cout<<d.Derived1::MainBase::mainbase<<endl;
但是,它可能不是你要实现的目标是什么。可能的话,你应该使用virtual
继承?你有什么手段都会有MainBase
成员的两个副本在你的对象,每一个继承的轨道。
(来自MSDN)。
当一个基类被指定为 虚拟的基础上,它可以作为一个 间接基不止一次无 它的数据成员的重复。一种 它的数据成员的单拷贝是 由所有基类共享其 使用它作为一个虚拟基
也许这样的事情会更适合你:
class Derived1: virtual public MainBase{
其他提示
您的代码不会编译,参照Mainbase作为钻石实例的碱时出现混淆。需要使用的虚拟在派生类(Derived1,Derived2的),以通过允许它们共享基类的一个实例,这样的解决这种不确定性:
class Derived1: virtual public Mainbase {
/* do your thing here*/
};
您应该能够像这样从 Diamond
班级:
Diamond::foo() {
Mainbase::mainbase = 0;
}
假设您的代码首先可以正确编译。看 迈克尔·福卡拉基斯 回答 有关编译的更多信息。另外,请参阅 DDJ 的这篇精彩文章: “多重继承被认为是有用的” 关于如何正确执行此操作。
不隶属于 StackOverflow