在gcc中'使用'关键字

lea*_*erg 4 c++ gcc

我有两个结构('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; }
Run Code Online (Sandbox Code Playgroud)

得到:

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
Run Code Online (Sandbox Code Playgroud)

111*_*111 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;
}
Run Code Online (Sandbox Code Playgroud)

虽然如果你想要做很多事情,那么将封装该功能可能更容易.

//member of CCC
int get_aa()
{
    return static_cast<BBB*>(this)->aa;
}
Run Code Online (Sandbox Code Playgroud)