C++如何使用基类实现来满足接口类纯虚方法的重写要求?
问题原因
C++多重继承场景下,不同基类的虚函数属于各自独立的虚函数表。BASE类实现的虚方法f()仅会覆盖BASE类自身的虚函数签名,不会自动实现INTERFACE类定义的纯虚方法f(),因此DERIVED类仍然包含未实现的纯虚函数,属于抽象类,无法直接实例化。
解决方案
在DERIVED类中显式实现INTERFACE要求的纯虚方法f(),内部直接转发调用BASE类的f()实现即可,修改后的完整代码如下:
class BASE { public: BASE() = default; ~BASE() = default; virtual void f(){} }; class INTERFACE { public: // 补充说明:如果需要通过INTERFACE指针销毁DERIVED实例,建议此处析构函数声明为virtual ~INTERFACE() = default; virtual void f() = 0; }; class DERIVED : public INTERFACE, public BASE { public: DERIVED() = default; ~DERIVED() = default; // 显式实现INTERFACE的纯虚f,转发到BASE的实现 void f() override { BASE::f(); } };
效果验证
int main() { DERIVED d; // 直接调用DERIVED实例的f d.f(); // 通过INTERFACE指针调用f INTERFACE* intf_ptr = &d; intf_ptr->f(); // 两种调用方式最终都会执行BASE::f()的实现,符合需求 return 0; }
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

