Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 2种解决虚方法的模糊继承的方法_C++_Inheritance - Fatal编程技术网

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而设计的,就不能起作用。