如何仅引入parent.h头文件即可使用所有子类?
解决方案:使用工厂方法模式实现
要实现仅引入parent.h即可创建子类实例的需求,最直接的方案是工厂方法模式——通过在父类中封装子类实例的创建逻辑,同时利用前向声明避免在parent.h中引入子类头文件。具体实现步骤如下:
1. 修改parent.h
添加子类的前向声明、虚析构函数(必须,否则会导致子类析构泄漏),以及创建子类实例的静态工厂方法:
#ifndef PARENT_H #define PARENT_H // 前向声明子类,告知编译器类的存在,无需引入头文件 class Child1; class Child2; class Parent { public: virtual void func() = 0; // 虚析构函数:确保delete父类指针时能正确调用子类析构 virtual ~Parent() = default; // 静态工厂方法:封装子类实例的创建逻辑 static Parent* createChild1(); static Parent* createChild2(); }; #endif // PARENT_H
2. 创建parent.cpp实现工厂方法
在实现文件中引入子类头文件,完成实例创建的具体逻辑:
#include "parent.h" #include "child1.h" #include "child2.h" Parent* Parent::createChild1() { return new Child1(); } Parent* Parent::createChild2() { return new Child2(); }
3. 修改main.cpp调用工厂方法
不再直接new子类,而是通过父类的静态方法获取实例:
#include "parent.h" int main() { Parent* base1 = Parent::createChild1(); Parent* base2 = Parent::createChild2(); base1->func(); base2->func(); delete base1; delete base2; return 0; }
方案说明
- 前向声明的作用:仅告知编译器
Child1、Child2是类类型,无需暴露其完整定义,避免在parent.h中引入子类头文件。 - 工厂方法的意义:将子类实例的创建逻辑转移到实现文件中,
main.cpp只需依赖父类接口,完全隔离子类的具体实现。 - 虚析构的必要性:父类作为抽象基类,必须声明虚析构,否则通过父类指针
delete时,无法触发子类的析构函数,会造成内存泄漏。
内容的提问来源于stack exchange,提问作者talentstream
相关产品推荐
相关产品推荐

