C++ 2种解决虚方法的模糊继承的方法
下面的代码来自,我在这里复制了代码以避免做我自己的示例,基本上我的项目中存在这个问题C++ 2种解决虚方法的模糊继承的方法,c++,inheritance,C++,Inheritance,下面的代码来自,我在这里复制了代码以避免做我自己的示例,基本上我的项目中存在这个问题 struct V { virtual void vf(); }; struct A : virtual V { void vf() override; }; struct B : virtual V { void vf() override; }; struct D : A, B { // Uncomment the following line to resolve. //
struct V {
virtual void vf();
};
struct A : virtual V {
void vf() override;
};
struct B : virtual V {
void vf() override;
};
struct D : A, B {
// Uncomment the following line to resolve.
// void vf() override;
};
我看了一下,建议使用使用
指令来解析不明确的符号
这个建议对这个示例不起作用,相反,为了解决这个问题,我们应该显式重写派生类中的基方法
我希望避免在派生类中显式重写,所以问题是,为什么不能像上面so链接中建议的那样使用指令而不是重写来解决这个问题?例如:
struct D : A, B {
using A::vf(); // not going to work
};
避免显式重写的原因是在一个基类中使用方法代码。在这种情况下,使用
可以简单地解决要调用的方法。
D
仍然需要是一个完整的对象,并且无论解析帮助程序是什么,vf
都必须有一个最终重写器。
如果vf
没有在基类中实现,那么使用就足够了,因为类型已经完成,您需要做的就是解析正确的调用 在你的情况下,我认为你必须给出一个明确的覆盖来解决歧义!但是,这将是一个极其简单的覆盖:
结构D:A,B{
//取消对以下行的注释以进行解析。
void vf()重写{A::vf();}
};
只要调用D::vf()
,它就会调用A
基类!因此,根据您的最后一句话,没有问题,因为使用了“基类之一中的方法代码”(但您必须指定哪个基类)。请注意:我通常不习惯在回答中使用短语“我想”:在这种情况下,我的意思是,据我所知,没有办法避免这种超控。然而,我很想看看这个论坛上那些非常体面的c++
程序员是否能想出一个办法来避免它。另外注意:vf()。像这样使用
的指令,如果不是为了影响vtable而设计的,就不能起作用。