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::
部分:一旦您选择了明确指向函数的路径的开头,您就不需要进一步限定。除非函数是虚拟的,并且您希望确保调用基本版本。