我正在编写一些模板化的纯虚拟基类,它们被多次继承,并在过程中发现了一些次要的奇怪现象。关键是,如果你在两个基类中定义了相同的方法,从两个编译继承并且工作正常,并且看起来你只需要派生类中的单个定义。我很好奇这里幕后发生了什么,这是正确的和有计划的行为还是危险的编译器监督?冲突方法的多重继承
请参阅以下示例代码示例:
namespace
{
template <typename T_NumType>
class InheritFrom
{
public:
virtual void doSomething(const T_NumType& numType) = 0;
virtual void sharedMethod() = 0;
}; // class
class MultipleInheritor : public InheritFrom<int>, public InheritFrom<float>
{
public:
void doSomething(const int& numType) {}
void doSomething(const float& numType) {}
void sharedMethod() {} // one definition here
}; // class
}
int main(int argc, char** argv)
{
MultipleInheritor mult;
mult.doSomething(5);
mult.sharedMethod();
}
编辑:
下方来看,在C++ 98标准的答案终于放晴了这件事对我来说。
从10.3:虚函数:
在任何格式良好的类,用于在 类或其任何直接或间接的 基类中声明的每个 虚函数有一个独特的最终 超控器该函数覆盖该函数 以及该函数的每个其他覆盖函数。
所以这意味着对于任何虚函数都会找到单个的最终覆盖。这是通过10.2:成员名称查找中详细说明的规则完成的。
所以在我已经介绍的情况下确实有两个基类函数,并且由于成员名称查找,派生类中的单个函数被确定为最终覆盖。所以我所拥有的完美结构以及C++编译器工作的逻辑结果。
对不起,如果代码示例不是100%清楚,我实际上是指sharedMethod()不是doSomething()是我的问题的对象。 – radman 2011-04-05 01:01:36
对不起!编辑它,虽然我不像我原来的回应那样确定。尽管如此,这应该包括它。 – EboMike 2011-04-05 01:06:02
你的答案是我认为它必须工作的方式(鉴于代码编译和工作),我真的希望确认这种情况,并且没有任何诡计正在进行。 – radman 2011-04-05 01:25:10