这是一些示例代码,解释了我想要实现的目标。
基本上,我有一个算法,它依赖于类中可用的一些基本操作。我在纯抽象基类中定义了这些操作。我想将该算法应用于通过为特定对象派生类来提供这些操作的各种对象。
然而,就这些操作而言,不同的派生对象彼此不兼容。我的问题是我是否可以避免使用 RTTI 来确保例如 bool derived2::identical(const base* other2)、asserts(或其他退出机制),其中 other2 不是 derived2 类型。
一种替代方法是在特定派生对象上对函数算法进行模板化,但这意味着它的实现必须存在于我不想这样做的头文件中,因为 1) 出于测试目的更改算法代码可能会导致重新编译大部分代码 2) 算法的实现将在头文件中公开,而不是很好地存在于对最终用户隐藏的源文件中。
头文件
#include <list>
class base
{
public:
virtual float difference(const base*) const = 0;
virtual bool identical(const base*) const = 0;
};
class derived1 : public base
{
public:
float difference(const base* other1) const
{
// other1 has to be of type derived1
if(typeid(other1) == typeid(this))
{
// process ...
}
else
{
assert(0);
}
return 1;
}
bool identical(const base* other1) const
{
// other1 has to be of type derived1
if(typeid(other1) == typeid(this))
{
// compare...
}
else
{
assert(0);
}
return true;
}
};
class derived2 : public base
{
public:
float difference(const base* other2) const
{
// process ...
// other2 has to be of type derived2
return 2;
}
bool identical(const base* other2) const
{
// do comparison
// derived1 and derived2 cannot be compared
return true;
}
};
// Declaration
int algorithm(std::list<base*>& members);
算法实现源文件
#include "header_file_containing_base"
int algorithm(std::list<base*>& members)
{
// This function only relies on the interface defined in base
// process members;
return 1;
}
主程序
int main()
{
// Create lists of derived1 and derived2
// Run algorithm on these lists
}