【发布时间】:2020-05-06 12:04:40
【问题描述】:
我有以下类架构:
class A{
public:
A() {}
virtual ~A() {}
void printA() { cout << "A" << endl; }
};
class B{
public:
B() {}
virtual ~B() {}
void printB() { cout << "B" << endl; }
};
class C : public A{
public:
C() : A() {}
virtual ~C() {}
void printC() { cout << "C" << endl; }
};
class D : public B{
public:
D() : B() {}
virtual ~D() {}
void printD() { cout << "D" << endl; }
};
class P: public C, public D{
public:
P() : C(), D() {}
~P() {}
void printP() { cout << "P" << endl; }
};
问题在于,在 Visual Studio 中某些转换失败,但在在线编译器中一切正常。我将在代码中更好地解释问题:
A* pObject= new P(); // let s say I have this instance of type P referenced by an A type pointer
dynamic_cast<P*>(pObject)->printP(); // works fine in both VS and online compiler, as expected
dynamic_cast<D*>(pObject)->printD(); // THIS IS THE PROBLEM, in Visual Studio cast returns nullptr, but in online compiler works fine.
return 0;
}
您知道这种行为的任何解决方案/原因吗?谢谢。
【问题讨论】:
-
标签已被删除,但你的代码中没有菱形问题。
P每个基只继承一次 -
@foreknownas_463035818 我没有说有钻石问题。我没有钻石问题。问题在于铸造。请再次阅读我的问题。与钻石问题无关。
-
您是否在 Visual Studio 项目配置中禁用了 RTTI?
-
根据cppreference(这里称为“side-cast”)和msvc docs(这里称为cross-cast),您的代码都是正确的。一定是一些编译器问题(根据 SO 中关于 MSVC 的问题数量,这很常见)
标签: c++ casting dynamic-cast