C++多继承:父类已实现纯虚函数时如何避免重复实现
问题根源
你遇到的是C++菱形继承引发的抽象类问题:
- 顶层抽象类
ISegmentReader包含纯虚函数readCacheFromDb() ISegmentManager和SegmentReader都以普通继承方式继承ISegmentReader,导致SegmentManager多重继承后会拥有两个独立的ISegmentReader基类子对象SegmentReader::readCacheFromDb()仅覆盖了自身分支下ISegmentReader的纯虚函数,但ISegmentManager分支下的ISegmentReader纯虚函数仍未被实现,因此SegmentManager被判定为抽象类,无法实例化。
无需重新实现的解决方案
通过虚继承让所有派生类共享同一个ISegmentReader基类实例,这样SegmentReader实现的函数就能覆盖唯一的纯虚函数:
修改两处继承关系为虚继承即可:
// 将ISegmentManager的继承改为虚继承 class ISegmentManager: public virtual ISegmentReader { // readCacheFromDb无需重新声明 // ... }; // 将SegmentReader的继承改为虚继承 class SegmentReader: public virtual ISegmentReader { public: void readCacheFromDb() override final; };
修改后,SegmentManager中只会存在一个ISegmentReader基类子对象,SegmentReader的readCacheFromDb()会覆盖这个唯一的纯虚函数,SegmentManager不再是抽象类,可正常实例化,无需额外声明实现SegmentManager::readCacheFromDb()。
内容的提问来源于stack exchange,提问作者user129186
相关产品推荐
相关产品推荐

