使用dynamic_cast和构造函数时出错

时间:2018-10-30 23:25:40

标签: c++ constructor dynamic-cast

#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;
}

我有两个问题。

  1. dynamic_cast无法正常工作。所以需要在其中添加一个虚函数 myclass
  2. 为什么pd->b不是-2(如在 构造函数?

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或其成员。