gpt4 book ai didi

c++ - 虚方法在多重继承下表现不同

转载 作者:太空宇宙 更新时间:2023-11-04 14:06:56 24 4
gpt4 key购买 nike

为什么会这样

struct Base {
virtual void visit(const A &) { };
virtual void visit(const B &) { };
}

这会在调用访问方法时提示歧义

template< typename T >
struct X {
virtual void visit(const T &) { };
};

struct Base: X< A >, X< B > { };

这也说明了同样的问题:

struct Y {
virtual void visit(const A &) { };
};

struct Z {
virtual void visit(const B &) { };
};

struct Base: Z, Y { };

不知何故,它看起来像多重继承与虚函数签名混淆......

gcc 版本 4.8.0 20130411(预发布)

最佳答案

这里虚拟性无关紧要,2 个基类是模板类这一事实也无关紧要。具有相同问题的更简单的代码是:

struct A {
void f(const A &) { }
};

struct B {
void f(const B &) { }
};

struct Der: A,B { };

这里 Der 有两个继承成员:A::f(const A &)B::f(const B &) ;它们可以这样调用:

Der d;
d.A::f(d);
d.B::f(d);

不是这样:

d.f((A&)d); // error: ambiguous name lookup
d.f((B&)d); // error: ambiguous name lookup

成员函数重载决议按照您的想法工作(找到两个 f 然后保留具有兼容参数列表的那个)。

在 C++ 中,member name-lookup 查找所有具有给定名称的非隐藏成员声明,​​因此在这里它找到 A::f(const A &)B::f(const B &),如果这些成员没有在同一个类中声明,它会立即失败。

您可以通过在同一个类中添加 2 个声明来解决此问题:

struct Der: A,B {
using A::f; // imports A::f(const A &)
using B::f; // imports B::f(const B &)
};

然后你可以这样做:

Der d;
d.f((A&)d); // OK: Der::f(&A)

记住:这纯粹是成员名称查找歧义。

关于c++ - 虚方法在多重继承下表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16452451/

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