我有一个非常普遍的问题,与c ++中的dynamic_cast有关: 我们假设我们有以下类:
class Father{
public:
Father(...); // this is constructor
//.....
//.. Whatever code in here, not important
~ Father(); //destructor
protected:
// some protected variables
} // end of class Father
class Son:public Father {
public:
Son(...); // this is cnostructor
//.....
//.. Whatever code in here, not important
~ Son(); //destructor
protected:
// some protected variables
} // end of class Son
class Another{
public:
Another(...); // this is constructor
//.....
//.. Whatever code in here, not important
~ Another(); //destructor
AnotherMethod(Father* fatherOpj,......) //
} // end of class Another
让我们说方法“AnotherMethod”做下一个:
AnotherMethod(Father* fatherOpj,......)
{
Son *sonObj = dynamic_cast<Son*>(fatherOpj);
// using sonObj
}
在主要内容中,我们执行以下操作:
Son* son1=Null;
//...
son1 = new Son(.....);
//....
AnotherMethod(son1,....);
现在,我想知道下一个问题:那种方式 - 当我们用一个类型为Son *的指针调用AnotherMethod时,在其签名中有父亲* - 我们会失去儿子中的字段/成员(父亲没有没有) 或者通过执行dynamic_cast,我们将能够拥有它们(在其中包含正确的值)?!
答案 0 :(得分:3)
如果指针确实指向Son
对象(即动态类型是Son
,而静态类型是{{1然后,所有Father
字段都存在,并且在转换指针后可以访问。
如果它没有指向Son
,则转换将失败,给出空指针。
请注意Son
仅在dynamic_cast
具有多态性时才有效 - 也就是说,如果它声明至少一个虚函数。在您的示例中,它不是多态的,因此强制转换将失败。
答案 1 :(得分:1)
我们会失去儿子的领域/成员
不,你只是无法从指向Father
的指针访问它。
通过做dynamic_cast,我们将能够拥有它们(正确的 里面的价值观)
是的,你会的,因为它仍然是Son
对象(当然,如果传递的对象有Son
类型的话。)