gpt4 book ai didi

c++ - 关于多重继承和歧义

转载 作者:太空狗 更新时间:2023-10-29 23:29:58 24 4
gpt4 key购买 nike

在下面的例子中:

class A {
public:
virtual void f() { cout << "a" << endl; }
virtual void h() { cout << "A" << endl; }
};
class s1 : public A {
public:
virtual void f() { cout << "s1" << endl; }
};
class s2 : public A {
public:
virtual void h() { cout << "s2" << endl; }
};
class GS : public s1, public s2 {
public:
};
int main()
{
s1 *q = new GS;
q->h();//no problem

GS a;
a.h();//error

}

为什么 a.h(); 给出歧义错误而 q->h(); 却没有?

难道 *q 没有一个 GS 的实例会导致同样的歧义问题吗?

最佳答案

您对多重继承的使用导致 A 的两个实例出现在 GS 中。当您使用 S1 *q 访问 GS 实例时,它遵循与 S1 关联的 A 实例。由于 S1 没有实现 h()q->h() 的输出将是 A< 提供的实现 本身。

如果你想让q->h()使用S2提供的实现,那么你需要使用虚拟继承来创建一个钻石。这样做还会消除使用 a.h() 时的歧义,因为虚拟继承只会导致 A 的一个实例出现在 GS 中。

class s1 : virtual public A {
public:
virtual void f() { cout << "s1" << endl; }
};
class s2 : virtual public A {
public:
virtual void h() { cout << "s2" << endl; }
};

关于c++ - 关于多重继承和歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35095227/

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