如何从基类向量中获取派生类变量?

Posted

技术标签:

【中文标题】如何从基类向量中获取派生类变量?【英文标题】:How to reach derived class variable from base class vector? 【发布时间】:2017-06-07 09:05:20 【问题描述】:
#include <iostream>
#include <vector>

class Entity

public:
    bool hinders_sight = false;
;

class Pillar : public Entity

public:
    bool hinders_sight = true;
;

int main()

    std::vector<Entity*> Entities;

    Pillar pillar;

    Entities.push_back(&pillar);

    std::cout << pillar.hinders_sight << std::endl;
    std::cout << Entities[0]->hinders_sight << std::endl;

    return 0;

pillar.hinders_sight 返回true(应该如此)

但是

Entities[0]-&gt;hinders_sight 返回false

如何从vector 联系hinders_sightpillar

【问题讨论】:

变量不是虚拟的。您需要创建一个虚拟函数来访问该变量。对类中的两个不同变量使用相同的名称也会令人困惑。也许您在这里要做的是让 Pillar 的构造函数将 Entity::hinders_sight 设置为 true,而不是声明另一个变量? @M.M 出于好奇,使用static_cast 有什么问题,例如:static_cast&lt;Pillar*&gt;(Entities[0])-&gt;hinders_sight @Jonas 如果实体[0] 不是支柱怎么办?我想 OP 打算将此程序扩展为实体可以包含从实体派生的各种其他类型的对象 @M.M 好点,虚函数是我这样做的方式。按照 lars 的回答建议使用 dynamic_cast 有什么想法吗? @Jonas 是的,它会编译失败。 dynamic_cast 只能用于多态类。当有多种类型需要测试时,它会导致代码非常糟糕。 【参考方案1】:

现在发生的情况是,您的派生类中有两个名为 hinders_sight 的变量,一个来自基类,另一个来自派生类。

这里有两种主要的方法来解决这个问题(我不建议在基类和派生类中为同一事物保留两个单独的变量),或者您可以将变量设置为基类中的受保护/私有变量,然后然后根据需要提供函数来获取和存储变量,或者您可以将get_hinders_sight() 函数设为虚拟函数。

class Entity 
public:
    Entity(bool hinders_sight_in = false) 
        : hinders_sighthinders_sight_in 
    bool get_hinders_sight()  return this->hinders_sight; 
private:
    bool hinders_sight = false;
;

class Pillar : public Entity 
public:
    Pillar() : Entitytrue 
;

或者

class Entity 
public:
    virtual bool get_hinders_sight()  return false; 
;

class Pillar : public Entity 
public:
    bool get_hinders_sight() override  return true; 
;

【讨论】:

【参考方案2】:

使用virtual bool HindersSight()return hinders_sight;,因为变量不是虚拟的。

编辑:哦,让你的变量受保护或私有以促进封装。您可以完全摆脱变量并为每个类实现 HindersSight() 以直接返回 true 或 false。

【讨论】:

以上是关于如何从基类向量中获取派生类变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过派生类函数从基类更改向量

从基类类型的向量访问派生类方法

从基类c ++的向量中的派生类调用虚拟方法[重复]

从基类派生类中 C++ 向量的可访问性

如何从基类中获取派生类名

如何从基类调用派生类方法?