gpt4 book ai didi

c++ - 具有冲突方法的多重继承

转载 作者:太空狗 更新时间:2023-10-29 21:29:07 25 4
gpt4 key购买 nike

我正在编写一些模板化的纯虚基类,它们是多重继承的,并在这个过程中发现了一个小问题。它的症结在于,如果您在两个基类中定义了相同的方法,则从两个基类中继承都可以编译并正常工作,而且看起来您只需要在派生类中定义一个。我很好奇这里的幕后发生了什么,这是正确的和计划好的行为还是危险的编译器疏忽?

请参阅下面的说明性代码示例:

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 开始:虚拟函数:

in any well-formed class, for each virtual function declared in that class or any of its direct or indirect base classes there is a unique final overrider that overrides that function and every other overrider of that function.

因此这意味着对于任何虚函数,都会找到一个最终覆盖。这是通过 10.2 中详述的规则完成的:成员名称查找。

所以在我介绍的情况下,确实有两个基类函数,并且由于成员名称查找,派生类中的单个函数被确定为两者的最终覆盖。所以我所拥有的是 C++ 编译器工作的完美结构和逻辑结果。

最佳答案

这些函数具有不同的签名(一个采用 int,一个采用 float),因此并不真正“相同”。

模板魔术稍微混淆了一点,但它和你有 foo(int) 是一样的。和 foo(float) - 这是两个不同的功能。你可以有 foo(int) constfoo(int) ,它们也是两个不同的函数。

编辑:好的,让我解决实际问题(如您的评论中所述)。从技术上讲,它仍然没有歧义:InheritFrom 的每个版本有自己的 vtable,并且 MultipleInheritor有一个 vtable。您可以选择将 sharedMethod 的任何父实现范围化(如 InheritFrom<int>::sharedMethod() ),但就调用者而言,您的类型对象 MultipleInheritor有一个 vtable,其中有一个条目 sharedMethod .

编辑 编辑:关键是您正在实现 sharedMethod在你的子类中。如果它不是纯的并且在 MultipleInheritor 中没有实现,将会出现编译器错误,因为不清楚将什么放入 vtable 中的一个槽中。

关于c++ - 具有冲突方法的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com