如果你想发挥一个classF
指针,你应该传递一个classF
指针。您的代码甚至不应该这样进行编译,因为功能的需要classF
,你给它一个classA
你能得到这个与类转换为classF
但,你不应该这样做编译。这会让你进入未定义的行为状态,因为你基本上会对你的编译器说谎,并说“这个其他类是classF
指针”,这不会是真的。
你总是可以放心地做它转换为基类的指针(像你在你的榜样与铸造classA
做)
你也应该切换从C风格的强制转换成C++风格的转换(如static_cast
或dynamic_cast
)。这也可以帮助你在你的情况。通过动态演员,你可以安全地将一个班级转化为一个训练有素的班级。
像这样:
class A {};
class B : public A {};
class C : public A {};
A* b-obj = new B;
A* c-obj = new C;
现在都c-obj
和b-obj
是指向A
,所以我们不知道了,如果他们是B或C.你可以用dynamic_cast
C* ptr = dynamic_cast<C*>(b-obj); //returns null because b-obj cannot be converted to C*
C* ptr = dynamic_cast<C*>(c-obj); //does not return null
检查此您的代码可以如下所示:
func = static_cast<A*>(e); // cast to base class.
//later then.
classF* funcF = dynamic_cast<F*>(func);
if(funcF != NULL)
{
function(func);
}
c风格的演员阵容可能会有一些你可能不喜欢的副作用。所以强烈建议熟悉C++强制转换。
请显示真实密码。在这种情况下,你应该使用'static_cast'。 –
如果'classF'是必需的,你需要'classF'。如果'classA'提供'function(...)'中需要的所有内容,则相应地更改参数类型。 – grek40
这取决于什么功能。它可以调用classF的特定方法。 – Daniele