【发布时间】:2013-06-26 14:55:12
【问题描述】:
我想使用抽象基类来实现接口和可用性。这个抽象基类将用作几个不同派生类的父类,每个派生类都需要抽象基类中纯虚函数的某个子集。我的方案大纲如下。
abstractclass.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();
};
鉴于当前的实现,以上所有类都是抽象类,不能从这些类创建对象。过去,我通过每个虚拟函数周围的预处理器指令解决了这个问题。
abstractclass.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 以允许指针被声明一次并适用于任何派生类是很有用的。
【问题讨论】:
-
我认为这根本没有任何意义。 #1,定义ABC(抽象基类)的重点是声明所有派生类实现的方法,因此它们是可互换的。 #2,使用预处理器修改 ABC(因此最终会出现多个冲突的定义)会导致未定义的行为。
-
目前确实如此,这就是为什么我正在寻找更好的解决方案。
-
如果不同的派生类从具有不同功能的基类派生,那么基类应该是不同的类,而不是迟早会违反单一定义规则的杂种混合。
-
同意,这有点歪曲了类型系统。在您想要的情况下,成为
AbstractClass没有任何意义——它不会告诉您任何有关您的对象支持的实际功能的信息。AbstractClass在你的设计中的目的是什么? -
@vckngs7:你想在这里解决什么问题?即为什么你想要一个通用的基类?
标签: c++ inheritance makefile abstract-class virtual-functions