我正在用C++制作一个简单的控制台游戏

我想知道在使用指向基类('Entity')的指针时是否可以从'entPlayer'类访问成员:

class Entity {
public:
    void setId(int id) { Id = id; }
    int getId() { return Id; }
protected:
    int Id;
};

class entPlayer : public Entity {
    string Name;
public:
    void setName(string name) { Name = name; }
    string getName() { return Name; }
};

Entity *createEntity(string Type) {
    Entity *Ent = NULL;
    if (Type == "player") {
        Ent = new entPlayer;
    }
    return Ent;
}

void main() {
    Entity *ply = createEntity("player");
    ply->setName("Test");
    ply->setId(1);

    cout << ply->getName() << endl;
    cout << ply->getId() << endl;

    delete ply;
}

我将如何调用ply-> setName等?

或者

如果不可能的话,还有什么更好的办法?

最佳答案

通过使用强制转换是可能的。如果您知道基类指针指向派生类的对象这一事实,则可以使用static_cast:

Entity* e = /* a pointer to an entPlayer object */;
entPlayer* p = static_cast<entPlayer*>(e);
p->setName("Test");

如果不确定,则需要使用dynamic_cast并测试结果以查看其不为null。请注意,如果基类至少具有一个虚函数,则只能使用dynamic_cast。一个例子:
Entity* e = /* a pointer to some entity */;
entPlayer* p = dynamic_cast<entPlayer*>(e);
if (p)
{
    p->setName("Test");
}

也就是说,使用多态性(即虚拟函数)封装类的功能会更好。

说到虚拟函数,作为实现的类层次结构具有未定义的行为:如果基类是虚拟析构函数,则只能通过指向其基类之一的指针来删除派生类型的对象。因此,您需要向基类添加虚拟析构函数。

关于c++ - 使用基类指针访问派生类成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2785309/

10-13 04:03