对象数组(基本情况)和派生 class 之间的动态转换
Dynamic casting between array of objects(base case) and a derived class
我有一个对象数组,其 class 是基数 class,数组的元素是派生的 classes。
Object *object [kNumPlayers] =
{
new Human ("Ms. Jones", 50, 1.0f, 2.0f),
new Alien ("Mx. Charm", 70),
new Human,
new Alien,
};
所以在这里,Object 是基础 class,而 Human 和 Alien 是派生的 classes。现在我的问题是我需要访问每个对象并添加额外的功能。比如,我需要访问对象 [0](即人类)并添加任何需要添加的内容。所以我试过了,
Human human0 = (Human)object[0]; // ERROR:'no matching function to call Human::Human(Object*&)'
OR
Human *human0;
human0 = dynamic_cast<Human*>(object[0]); //ERROR: cannot dynamic_cast 'object[0]' (of type 'class Oject*') to type 'class Human*' (source is not polymorphic)'
要编译 dynamic_cast
,规则是源 class 必须是多态的 class — 这意味着它必须具有至少一个 virtual
函数,即使只是析构函数。在您的情况下,来源 class 是 Object
class ,它必须是多态的:
class Object
{
public:
virtual ~Object() = default; //at least, it should be virtual
//etc
};
修复后代码至少应该可以编译。然而,在 C++ 中有很多东西你应该避免使用:
- 避免使用 C 风格数组(动态或其他方式)
- 更喜欢
std::vector
或std::array
。
- 避免自己管理内存——也就是说,避免使用 naked
new
。
- 首选 RAII — 在你的情况下使用
std::unique_ptr
或 std::shared_ptr
任何适合你需要的东西。
那就是你应该这样:
std::array<std::shared_ptr<Object>, 10> objects {
std::make_shared<Human>("Ms. Jones", 50, 1.0f, 2.0f),
std::make_shared<Alien>("Mx. Charm", 70)
//etc
};
并投射为:
std::shared_ptr<Human> human = std::dynamic_pointer_cast<Human>(objects[0]);
希望对您有所帮助。
我有一个对象数组,其 class 是基数 class,数组的元素是派生的 classes。
Object *object [kNumPlayers] =
{
new Human ("Ms. Jones", 50, 1.0f, 2.0f),
new Alien ("Mx. Charm", 70),
new Human,
new Alien,
};
所以在这里,Object 是基础 class,而 Human 和 Alien 是派生的 classes。现在我的问题是我需要访问每个对象并添加额外的功能。比如,我需要访问对象 [0](即人类)并添加任何需要添加的内容。所以我试过了,
Human human0 = (Human)object[0]; // ERROR:'no matching function to call Human::Human(Object*&)'
OR
Human *human0;
human0 = dynamic_cast<Human*>(object[0]); //ERROR: cannot dynamic_cast 'object[0]' (of type 'class Oject*') to type 'class Human*' (source is not polymorphic)'
要编译 dynamic_cast
,规则是源 class 必须是多态的 class — 这意味着它必须具有至少一个 virtual
函数,即使只是析构函数。在您的情况下,来源 class 是 Object
class ,它必须是多态的:
class Object
{
public:
virtual ~Object() = default; //at least, it should be virtual
//etc
};
修复后代码至少应该可以编译。然而,在 C++ 中有很多东西你应该避免使用:
- 避免使用 C 风格数组(动态或其他方式)
- 更喜欢
std::vector
或std::array
。
- 更喜欢
- 避免自己管理内存——也就是说,避免使用 naked
new
。- 首选 RAII — 在你的情况下使用
std::unique_ptr
或std::shared_ptr
任何适合你需要的东西。
- 首选 RAII — 在你的情况下使用
那就是你应该这样:
std::array<std::shared_ptr<Object>, 10> objects {
std::make_shared<Human>("Ms. Jones", 50, 1.0f, 2.0f),
std::make_shared<Alien>("Mx. Charm", 70)
//etc
};
并投射为:
std::shared_ptr<Human> human = std::dynamic_pointer_cast<Human>(objects[0]);
希望对您有所帮助。