C++23中如何为基类纯虚函数创建别名成员函数以适配未修改的派生类
C++23中如何为基类纯虚函数创建别名成员函数以适配未修改的派生类
这个重构场景我之前碰过好几次,刚好有个不用动派生类的简单解法,在C23里(其实早到C98都能用)就能搞定。
你现在卡壳的点在于,基类B的纯虚函数F强制要求所有派生类必须实现它,但D2只写了G没写F,所以编译器不让实例化D2。要绕开这个限制,我们得调整基类的设计,让F和G能互相当对方的“兜底实现”,同时兼容你已经写好的D1和D2。
具体做法是把基类里的F从纯虚改成普通虚函数,同时添加G的虚函数声明,让它们的默认实现互相调用:
class B { public: // 不再是纯虚函数,默认调用G作为兜底 virtual int F(int i) { return G(i); } // 新增虚函数,默认调用F作为兜底 virtual int G(int i) { return F(i); } }; // 完全不需要修改这两个派生类 class D1 : public virtual B { public: virtual int F(int i) { return i * 2; // 你的原有实现 } }; class D2 : public virtual B { public: virtual int G(int i) { return i * 3; // 你的原有实现 } };
这样修改后,两个派生类都能正常实例化,而且完全符合你的需求:
- 对于D1的对象,调用
F会直接用它自己的实现;调用G时,基类的G会自动转发到D1的F,结果和调用F一致。 - 对于D2的对象,调用
G用它自己的实现;调用F时,基类的F会转发到D2的G,同样能得到正确结果。
唯一需要注意的小细节:如果后续新增的派生类既没实现F也没实现G,调用这两个函数会触发无限递归,最终导致栈溢出。不过只要你保证所有派生类至少实现其中一个函数,就不会遇到这个问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

