#include "stdafx.h"
#include <iostream>
using namespace std;
class myclass {
public:
int a;
myclass() : a(-1){};
};
class derivedclass : public myclass {
public:
int b;
derivedclass() : b(-2) {};
};
int main()
{
myclass* p= new myclass;
// derivedclass* pd = dynamic_cast<derivedclass*>(p);
derivedclass* pd = static_cast<derivedclass*>(p);
cout << pd->b << endl;
return 0;
}
我有两个问题。
dynamic_cast
无法正常工作。所以需要在其中添加一个虚函数
myclass
? pd->b
不是-2
(如在
构造函数?答案 0 :(得分:2)
dynamic_cast
无法正常工作有两个原因。
一个是,正如您猜到的,you need virtual functions for dynamic_cast
to work,这就是说基本类型myclass
必须是多态的。
另一个原因也解决了您的第二个问题。在您的代码中,derivedclass
继承自myclass
。这意味着derivedclass
类型的任何对象也是myclass
类型的对象。它确实不是暗示任何myclass
类型的对象也必须也是derivedclass
类型,您似乎在假设。
// creates a new instance of myclass, NOT an instance of derivedclass
myclass* p= new myclass;
// assuming myclass is polymorphic, returns a type-safe pointer to a derivedclass object
// if p is not such an object, returns nullptr, which is useful for error checking
derivedclass* pd1 = dynamic_cast<derivedclass*>(p);
// this is very unsafe! pd2 is now a 'wild' pointer to an object that doesn't exist
derivedclass* pd2 = static_cast<derivedclass*>(p);
// this is Undefined Behavior: there is no such `b` in memory at pd2, and that memory
// is not yours to read from
cout << pd2->b << endl;
pd->b
不是-2
的原因是因为derivedclass
的构造函数从未运行。您从未创建derivedclass
的对象。
答案 1 :(得分:1)
dynamic_cast无法正常工作。那么需要在派生类中添加一个虚函数吗?
是的。您必须具有虚函数才能使用动态强制转换。
此外,还必须检查动态强制转换是否导致空指针。在这种情况下,由于p
并不指向derivedclass
的实例,因此将导致null(如果存在虚函数)。
为什么pd-> b不是在构造函数中初始化的-2?
该行为是不确定的。尚未构造derivedclass
或其成员。