多重继承求解抽象类
Multiple inheritance to solve abstract classes
>假设我有 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
,B
和C
是抽象的,而A
则不是。如果我只是在B
的I
继承中添加virtual
,那么A::X()
C
中解析I::X()
。
但是,我无法更改B
的来源。
我的问题:我可以在不更改B
的情况下A::X()
解决C
I::X
吗?我试图宣布A
和B
是虚拟的,但C
无济于事。我试图没有多余的代码(例如,让 C 声明 X() { A::X(); })。有什么巧妙的黑客吗?
另外 - 有几个非常像这样的问题,但我找不到任何关于使用virtual
继承的讨论。如果我错过了,请指出我一个。
您的问题出在 vtables 上。在你当前的代码中,你有两个 - 一个在A
的I
中,一个在B
的I
中。只要只有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(); }
};
至于虚拟继承,这里肯定有一些。但欢迎您问...
这很好:当虚拟继承是一个好的设计时?
这里的问题是,在 C 中你有两个接口 I。这就是为什么 A::x() 满足它的接口 I - 但它不能使 B 类的抽象接口 I 不抽象。对于 C 来说,只有一个 I 接口的唯一方法 - 是将 B 更改为虚拟派生自 I - 这样,来自 A 和来自 B 的 I 接口都将合并为 C 中的一个。您不能更改B - 因此唯一的方法是添加您试图避免的冗余代码。我的意思是定义 C::X()。
我能想到的唯一方法是将B*
(或智能变体)组合成C
而不是从中继承,并转发适当的方法。你不能在保持继承的同时做到这一点,因为编译器不知道要遵循哪个I
的继承链。
- C++中模板化异常类的多重继承
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 抽象类析构函数与继承"Shutdown"函数
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 带有此指针的模板类多重继承构造函数不起作用?
- C++抽象类和继承
- 无法使用多重继承 c++ 实例化抽象类
- 有没有办法实现从 c++ 中其他抽象类多重继承的抽象类?
- C++类多重继承错误
- 抽象类与继承C++
- 多重继承求解抽象类
- 虚拟类多重继承
- 多重继承抽象类
- 类C++.多重继承
- c++,抽象类和继承
- 抽象类的c++继承
- 使用多重继承来满足抽象基类
- 如何在c++中对抽象类的多重继承使用clone()
- 来自接口(抽象类)的多重继承