我想使用抽象基类来实现接口和可用性。这个抽象基类将用作几个不同派生类的父类,每个派生类都需要抽象基类中纯虚函数的某个子集。我的方案大纲如下。
抽象类.hpp
AbstractClass{
/* Declaration */
void pureVirt1() = 0;
void pureVirt2() = 0;
void pureVirt3() = 0;
};
派生类1.hpp
DerivedClass1{
/* Declaration */
void pureVirt1();
};
派生类2.hpp
DerivedClass2{
/* Declaration */
void pureVirt2();
};
派生类3.hpp
DerivedClass3{
/* Declaration */
void pureVirt3();
};
鉴于当前的实现,上述所有类都是抽象类,不能从这些类创建对象。过去,我已经通过围绕每个虚拟函数的预处理器指令解决了这个问题。
抽象类.hpp
AbstractClass{
#ifdef _1
void purVirt1()=0;
#endif
...
在每个派生类的头文件的顶部,在包含到 abstractclass.hpp 之前,我会写如下内容
派生类1.hpp
#define _1
#include"abstractclass.hpp"
...
当我处理小项目而不是编写 make 文件时,这很有效。只要我将指令保存在正确的位置,抽象类的标头就会根据使用它的派生类有效地进行更改。现在我正在使用makefile,这不起作用。abstractcalss.cpp 编译时没有头文件中的任何虚函数,因为它是与派生类分开编译的。我正在为此寻找一个好的解决方法。
我想要这个功能,因为我有许多来自这个抽象基类的类似派生类,这些派生类被我编写的各种其他工具使用。我想让这些其他工具尽可能简单,只使用指向抽象类的指针,而不是为所有东西编写模板类。
--更多信息 我有一种情况,AbstractClass 与 SubAbstractClass 存在关联关系,并且是通过在 AbstractClass 中使用指向 SubAbstractClass 的指针来实现的。此外,对于每个派生类,都存在与 SubDerivedClass1、SubDerivedClass2 类似的 has-a 关系……我不想为我创建的每个新类编写容器,特别是因为我可以组合我的派生类来创建新类重要且实用的新类的任何此类组合都需要创建适当的子类集。为此,有一个 ABC 以允许指针被声明一次并适用于任何派生类是很有用的。