'using' gcc 中的关键字

'using' keyword in gcc

本文关键字:关键字 using gcc      更新时间:2023-10-16

我得到了两个包含相同var名称('aa')的结构('AAA'和'BBB'),以及通过多重继承使用这两个结构定义的第三个结构('CC')。[这两个结构应该是不相关的,所以当两个类有一个共同的祖先时,这不是著名的钻石问题]。对于派生结构"CCC",我试图显式选择使用派生结构"AAA"中的var,但gcc仍然抱怨定义不明确。为什么?

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

它失败了,因为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;
}

您可以设置指向相关成员的指针:

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; }

您可以使用虚拟继承。例如,这个代码应该以这种方式重写:

struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : virtual public AAA , virtual public BBB { using AAA::aa; };