[英]Accessing derived class members with a base class pointer
我正在用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");
}
也就是说,使用多态(即虚函数)封装类的功能会好得多。
说到虚函数,作为实现的类层次结构具有未定义的行为:如果基类作为虚拟析构函数,则只能通过指向其基类之一的指针来删除派生类型的对象。 因此,您需要向基类添加虚拟析构函数。
我会考虑做这样的事情:
public:
void setId(int id)
{
Id = id;
}
void virtual setName( string name ) = 0; // Virtual Function
string virtual getName() = 0; // Virtual Function
int getId() { return Id; }
protected:
int Id;
};
class entPlayer : public Entity {
string Name;
public:
entPlayer() {
Name = "";
Id = 0;
}
void entPlayer::setName(string name) { // Must define function
Name = name;
}
string entPlayer::getName() { return Name; } // again must define function here
};
C ++使你想要做的事情变得非常尴尬,因为这可能不是你应该做的,它试图引导你进行良好的面向对象设计。 实际上,默认情况下, 编译器通常会禁用运行时类型信息 (RTTI),这是使dynamic_cast工作所必需的。
如果不了解更广泛的背景,很难说你应该做些什么。 我可以说的是,如果你想要一个更具体的指针,
你应该在它上面放一个戒指,
你几乎肯定不应该使用一个返回Entity*
的函数,并且可能有更好的方法。
你可以做一个动态演员:
entPlayer * pPlayer = dynamic_cast<entPlayer *>(pointer_to_base);
这将(如果成功)导致派生指针。
否则返回NULL
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.