问题描述
我的方法接收一个对象作为参数,它必须作为基类型接受(尽管它作为派生类型发送)。我想制作此对象的副本并将其向下转换为派生类型,以便我可以调用派生类型的方法(修改派生对象的属性)。
我一直在处理 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)
被引用的基类可以是任何派生类中的子对象。