C++如何无需手动转发方法将两个已有实现合并到公共接口
问题根源
你原有代码无法编译的核心原因是继承结构中存在多份接口实例:InterfaceA和InterfaceB各有两个副本,一份来自CommonInterface的继承链,另一份来自A/B的继承链。你在A、B中实现的a()、b()只覆盖了A/B继承链上的虚函数,CommonInterface继承链上的两个接口的纯虚函数仍未实现,因此Common属于抽象类无法实例化,仅用using声明也解决不了虚函数覆盖的问题。
解决方案:使用虚拟继承
不需要手动编写每个方法的转发逻辑,只需要把所有对InterfaceA、InterfaceB的继承改为虚拟公共继承,就能保证整个继承树中只有唯一一份InterfaceA和InterfaceB实例,此时A、B中的实现会自动覆盖接口的纯虚函数,原有using声明即可生效。
修改后的完整代码如下:
#include <iostream> struct InterfaceA { virtual void a() = 0; }; void specific_a( InterfaceA& i ) { i.a(); } struct InterfaceB { virtual void b() = 0; }; void specific_b( InterfaceB& i ) { i.b(); } // 改为虚拟继承两个接口 struct CommonInterface : virtual public InterfaceA, virtual public InterfaceB { }; void common( CommonInterface& i ) { i.a(); i.b(); specific_a(i); specific_b(i); } // 改为虚拟继承InterfaceA struct A : virtual public InterfaceA { void a() { std::cout << "I'm A" << std::endl; } }; // 改为虚拟继承InterfaceB struct B : virtual public InterfaceB { void b() { std::cout << "I'm B" << std::endl; } }; struct Common : CommonInterface, private A, private B { using A::a; using B::b; }; int main() { Common c; common(c); return 0; }
运行结果
代码编译运行后输出如下,完全符合预期:
I'm A I'm B I'm A I'm B
内容的提问来源于stack exchange,提问作者nyarlathotep108
相关产品推荐
相关产品推荐

