gpt4 book ai didi

c++ - 多重继承解决抽象类

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:11 25 4
gpt4 key购买 nike

假设我有 4 个类:

class I { public: virtual void X() = 0; };
class A : public virtual I { public: virtual void X() { } };
class B : public I { };
class C : public A, public B { };

I , BC是抽象的,其中 A不是。如果我简单地添加 virtual继承I对于 B , 然后 A::X()解决 I::X()C .

但是,我无法更改 B 的来源.

我的问题:我能得到A::X()吗?解决I::X对于 C无法更改 B ?我试过声明 AB虚拟到C无济于事。我试图没有冗余代码(例如让 C 声明 X() { A::X(); })。有什么巧妙的技巧吗?

另外 - 有几个问题非常像这样,但我找不到任何关于使用 virtual 的讨论遗产。如果我错过了,请指给我一个。

最佳答案

您的问题出在虚拟表上。在您当前的代码中,您有两个 - 一个在 AI 中,一个在 BI。只要 A 实际上继承 I,您就可以使用常规继承并节省开销。如果两者实际上都继承了 I,则 C 中只有一个 I 实例,因此只有一个 vtable,而 A::X 确实可以覆盖纯虚拟 I::X

鉴于您无法更改 B,您唯一可以处理两个 vtable 的地方是 C。在我看来,要走的路就是你提到的 - 只需让 C::X 将调用转发给 A::X。那里没有代码重复,它使 C 变得非抽象:

class C : public A, public B {
public:
virtual void X() { A::X(); }
};

至于虚拟继承,肯定有have been some here .但欢迎你问...

关于c++ - 多重继承解决抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11366921/

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