我有两个结构('AAA'和'BBB')包含相同的var名称('aa')和第三个结构('CCC'),它们通过多重继承定义。 [这两个结构应该是无关的,所以当两个类有一个共同的祖先时,这不是着名的钻石问题]。 对于派生结构'CCC',我试图明确选择使用派生结构'AAA'中的var,但是gcc仍然抱怨模糊def。为什么呢?
struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : public AAA , public BBB { using AAA::aa; };
int main() { CCC ccc; return ccc.aa; }
给出:
x.cpp: In function 'int main()':
x.cpp:4:34: error: request for member 'aa' is ambiguous
x.cpp:2:18: error: candidates are: int BBB::aa
x.cpp:1:18: error: int AAA::aa
答案 0 :(得分:5)
失败是因为aa已经在该范围内。 using AAA.aa
只会再次将其带入范围。
你可以将它转换为类型并以这种方式提取它。
#include <iostream>
struct AAA {
int aa;
AAA() : aa(1) {}
virtual ~AAA(){};
};
struct BBB {
int aa;
BBB() : aa(5) {}
virtual ~BBB(){};
};
struct CCC : public AAA , public BBB
{
CCC() : AAA(), BBB() {}
// using AAA::aa;
};
int main()
{
CCC ccc;
std::cout << static_cast<BBB*>(&ccc)->aa << std::endl;
}
虽然如果你想要做很多事情,但是打包这个功能可能会更容易。
//member of CCC
int get_aa()
{
return static_cast<BBB*>(this)->aa;
}
答案 1 :(得分:0)
您可以设置指向相关成员的指针:
struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : public AAA , public BBB {
int *A_aa; int *B_aa;
CCC():
A_aa(&static_cast<AAA*>(this)->aa),
B_aa(&static_cast<BBB*>(this)->aa) { }
};
int main() { CCC ccc; return *ccc.A_aa; }
答案 2 :(得分:0)
您可以使用Virtual inheritance。对于您的示例,此代码应以这种方式重写:
struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : virtual public AAA , virtual public BBB { using AAA::aa; };