gpt4 book ai didi

c++ - 使用基类指针访问派生类成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:15 25 4
gpt4 key购买 nike

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

我想知道我是否可以在使用指向基类(“实体”)的指针时访问“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 并测试结果以查看它是否不为空。请注意,如果基类至少有一个虚函数,则只能使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com