我试图找到一种有效的方法(使用多态性)在外部复制两个派生类之间的特定属性。我有一组从基类派生的数据类DataClassA
。我想在一个单独的过滤器类中对这些数据类进行操作,该过滤器类将DataClassA
引用作为输入和输出参数。过滤器将执行常见的必要操作DataClassA
,但我还想将特定于类的属性从我的输入传播到输出类。考虑:
class DataClassA
{
public:
virtual void copyAttributes( DataClassA& copyFrom );
}
class DataClassB : public DataClassA
{
public:
virtual void copyAttributes( DataClassA& copyFrom );
};
class DataFilter
{
void run( DataClassA& input, DataClassB& output )
{
//do some calculations here
...
//then copy over attributes
output.copyAttributes( input );
}
};
我的问题显然是copyAttributes()
取决于需要知道输入和输出派生类的类型(不一定要相同)。但是,过滤器只会处理对基类的引用DataClassA
。我的反应是简单地制定 a dynamic_cast
,尽管我冒着被扇耳光的风险(以及其他可能的负面后果)。如果我这样做,我只需copyAttributes
为每个调用copyAttributes
父类的派生类创建一个方法,然后使用它dynamic_cast
来查看copyFrom
对象是否属于同一类型:
void DataClassB::copyAttributes( DataClassA& copyFrom )
{
//copy attributes from parent class
DataClassA::copyAttributes( copyFrom );
//test if the class being copied from is of type DataClassB
DataClassB* copyPtr = dynamic_cast<DataClassB*>©From;
if( copyPtr != NULL )
{
//copy DataClassB-specific attributes from copyFrom to this
...
}
}
我能找到的关于这个问题的最相似的帖子是这里的Virtual functions and polymorphism。我的主要问题是:1)我提议的 dynamic_cast 使用不合适吗?2)如果是这样,我该如何以copyAttributes
另一种方式实现?虽然我不确定它会是什么样子,但有一些关于使用访问者设计模式的参考。
这是可视化工具包 (VTK) 所做工作的一种更简单的版本,因为我正在使用对许多不同数据类进行操作的过滤器类。有趣的是,它们通过包含宏来处理 RTTI,这些宏包含类和父类的字符串名称,可以直接进行比较以正确地向下转换数据类型。