c++ - 无需动态转换即可复制派生类属性的方法

标签 c++ polymorphism dynamic-cast double-dispatch

我正在尝试找到一种有效的方法(使用多态性)在外部的两个派生类之间复制特定属性。我有一组从基类 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 的引用。我的 react 是简单地建立一个 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*>&copyFrom;
    if( copyPtr != NULL )
    {
        //copy DataClassB-specific attributes from copyFrom to this
        ...
    }
}

关于这个问题我能找到的最相似的帖子在这里 Virtual functions and polymorphism .我的主要问题是:1)我建议使用 dynamic_cast 不合适吗?和 2) 如果是这样,我将如何以另一种方式实现此 copyAttributes?有人提到使用访问者设计模式,但我不确定那会是什么样子。

从某种意义上说,这是可视化工具包 (VTK) 的一种更简单版本,我使用的是对许多不同数据类进行操作的过滤器类。有趣的是,它们通过包含包含类和父类字符串名称的宏来处理 RTTI,这些类和父类可以直接比较以正确向下转换数据类型。

最佳答案

看来你想要多分派(dispatch)(正如我在这里所做的那样:https://ideone.com/8VxALs)
这要求访问者知道每个派生类型。

另一种方法是每次都使用dynamic_cast

一个简单的双分派(dispatch)可以按如下方式完成:

class DataClassA
{
public:
    virtual ~A() {}
    virtual void copyAttributes(DataClassA& copyFrom) { copyFrom.copyAttributesToA(*this); }
    virtual void copyAttributesToA(DataClassA& copyTo) { /* Implementation to copy A -> A */ }
    virtual void copyAttributesToB(DataClassB& copyTo) { /* Implementation to copy A -> B */ }  
};

class DataClassB : public DataClassA
{
public:
    void copyAttributes(DataClassA& copyFrom) override { copyFrom.copyAttributesToB(*this); }
    void copyAttributesToA(DataClassA& copyTo) override { /* Implementation to copy B -> A */ }
    void copyAttributesToB(DataClassB& copyTo) override { /* Implementation to copy B -> B */ }
};

关于c++ - 无需动态转换即可复制派生类属性的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23438886/

相关文章:

c++ - 使用 Fiddler 拦截 Boost.Asio HTTP/S 请求

c++ - C++中的异常证明赋值运算符

c++ - 在基类的复制构造函数上调用虚方法时多态性不启动

c++ - Derived pointer to Base pointer conversion using static_cast, dynamic_cast, or explicit conversion 不会调用基函数

c++ - 可以接受使用虚拟继承来防止意外创建钻石吗?

c++ - 使用dynamic_pointer_cast时出现段错误

c++ - 成员函数从 main 更改对象而不是从其他函数更改对象

C++ 函数 = 删除

c++ - 静态基类型和动态派生类型的输出

c++ - 运行时链接错误 : The procedure entry point glewInit@0 could not be located