将属性值添加到向下转换结构会导致分段错误

时间:2015-04-05 07:54:08

标签: c++

我收到了这段代码:

#include <iostream>
#include <string>

using namespace std;

struct Base {
  Base(string name) {
    this->name = name;
  }
  string name;
};

struct Derived: Base {
  string name2;
};

template <typename T>
T createNode(string name) {
  Base* node = new Base(name);
  return static_cast<T>(node);
}

int main() {
  Derived* node = createNode<Derived*>("hej");
  node->name2 = "bajs";
  cout << node->name2;
}

node->name2 = "bajs";行导致(随机)分段错误。我只是想知道如何纠正这个问题而不会导致分段错误。我仍然想调用createNode()来创建基节点并在之后设置所有属性成员。它在c++中是否可行?

2 个答案:

答案 0 :(得分:2)

这段代码:

template <typename T>
T createNode(string name) {
  Base* node = new Base(name);
  return static_cast<T>(node);
}

创建一个Base类型的对象。

此:

  Derived* node = createNode<Derived*>("hej");
  node->name2 = "najs";    // No need to use rude words, even if you think most people can't read them.

将创建的对象用作Derived。由于Derived需要比Base更多的空间,因此当您使用name2时,您将覆盖createNode中创建的对象之外的内容。 name2也未被构造,这意味着赋值很可能使用随机垃圾值,这本身可能导致崩溃。

您需要重新排列代码,使其首先创建正确的对象,如果您想使用构造函数,则需要使用Derived的构造函数来获取命名对象。 [还有其他一些方法可以实现这一目标,但通常不是你想要的]

答案 1 :(得分:1)

也许,我不明白你的计划的想法,但我想,它必须是这样的:

#include <iostream>
#include <string>

using namespace std;

struct Base {
  Base(string name) {
    this->name = name;
  }
  string name;
};

struct Derived: Base {
    Derived(string name):Base(name)
    {
    }
    // string name2; // it is not needed
};

template <typename T>
T* createNode(string name) {
  T* node = new T(name);
  return node;
}

int main() {
  Derived* node = createNode<Derived>("hej");
  node->name = "bajs";
  cout << node->name;
}