C++ 虚拟继承与签名重叠

C++ 虚拟继承与签名重叠,c++,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(){

假设我们有以下代码:

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。我们可以在不使用强制转换的情况下执行此操作吗

首先,没有强制转换:您只需确定您想要哪个版本的
A
,因为有多个版本。当然,您选择的符号实际上不起作用,因为它首先不能解决歧义。我猜你是想用这样的东西

pA->B::f();
如果您不想让类的用户承担选择调用哪个成员函数的负担,则必须为
D
提供合适的转发函数,例如:

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

首先,没有强制转换:您只需限定您想要哪个版本的
A
,因为有多个版本。当然,您选择的符号实际上不起作用,因为它首先不能解决歧义。我猜你是想用这样的东西

pA->B::f();
如果您不想让类的用户承担选择调用哪个成员函数的负担,则必须为
D
提供合适的转发函数,例如:

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

问题到底是什么?实际上,继承意味着你得到一个……的实例,问题到底是什么?实际上,继承意味着您得到一个……的实例,我刚刚意识到我可以调用pA->B::A::f();:)这将改变最基本类A的值。您可以省略
A::
部分:一旦您选择了明确指向函数的路径的开头,您就不需要进一步限定。好的,除非函数是虚拟的,并且您希望确保调用基本版本。我刚刚意识到我可以调用pA->B::A::f();:)这将改变最基本类A的值。您可以省略
A::
部分:一旦您选择了明确指向函数的路径的开头,您就不需要进一步限定。除非函数是虚拟的,并且您希望确保调用基本版本。