虚拟继承和签名重叠

时间:2012-03-18 14:15:15

标签: c++

假设我们有以下代码:

struct A{
    virtual ~A(){}

    void f(){
        p = 42;
    }

    int p;
};

struct B : public virtual A{};
struct C : public virtual A{};
struct D : public B, public C, public A{}; //let's add non-virtual inheritance

int main(){
    D* pA = new D();
    pA->A::f(); //!

    return 0;
}

有没有办法在最基类A中将p设置为42? 以下构造pA-> A :: f();对于非虚拟继承的类A,将p设置为42.我们可以在没有强制转换的情况下执行此操作吗

1 个答案:

答案 0 :(得分:3)

首先,没有演员阵容:你只要符合你想要的A版本,因为不止一个版本。当然,您选择的符号实际上不起作用,因为它首先不能解决歧义。我想你的意思是使用像

这样的东西
pA->B::f();

如果您不想承担选择调用班级用户的成员函数的负担,则必须为D提供合适的转发功能,例如:

void D::f() { this->B::f(); }