向下转换和复制 const 对象

时间:2021-02-06 22:09:50

标签: c++ qt sigabrt dynamic-cast descendant

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

我一直在处理 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,它跨线程接收信号。我认为不能(或至少安全地)跨线程传递指向对象的指针,这就是我按值传递的原因。

1 个答案:

答案 0 :(得分:2)

<块引用>
void mymethod(const Base message)

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

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

void mymethod(const Base& message)

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

相关问题