向下转换和复制 const 对象

问题描述

我的方法接收一个对象作为参数,它必须作为基类型接受(尽管它作为派生类型发送)。我想制作此对象的副本并将其向下转换为派生类型,以便我可以调用派生类型的方法修改派生对象的属性)。

我一直在处理 dynamic_cast 的变体,但无法让编译器满意,或者,它编译并在 dynamic_cast 行上得到一个 sigABRT(如下所示):

void mymethod(Base message) {
    if (message.messageType() == "D") {
        Derived& derivedMessage = dynamic_cast<Derived&>(message);
        Derived derivedcopy = derivedMessage;
        derivedcopy.derMethod();

以防万一,mymethod 是一个 Qt SLOT,它跨线程接收信号。我认为不能(或至少安全地)跨线程传递指向对象的指针,这就是我按值传递的原因。

解决方法

void mymethod(const Base message)

如果传递类型为 Base 的参数,则对象的类型是 Base 而不是其他类型 - 即它永远不会是派生类型的对象。

如果你想拥有运行时多态,那么你需要使用间接。典型的解决方案是将引用传递给基类子对象:

void mymethod(const Base& message)

被引用的基类可以是任何派生类中的子对象。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...