[英]C++ polymorphism. Methods
我有一个小问题,无法解决。 目前,我正在做一个关于动物之间马拉松的项目。 我不得不使用多态,即使没有它也可能会更容易。 这是我的代码示例:
class Animal
{
public:
virtual void run()=0;
virtual bool return_if_finished()=0;
virtual float return_distance()=0;
}
class Turtle :public Animal
{
int id;
float distance; //etc.
public:
void run();
bool return_if_finished();
float return_distance();
void set_id(int i);
void a_friend();
}
class Snail :public Animal
{
float distance; //etc.
public:
void run();
bool return_if_finished();
float return_distance();
void broken_leg();
}
这是一个示例。 从主类“动物”继承的所有类都只有三个相互方法。 他们还有一些只需要的东西。
如果我想在这样“运行”的方法中编写代码:
...
Animal* turtles = new Turtle[amount];
Animal* snails = new Snail[amount];
for(int i=0; i<amount; i++)
turtles[i].set_id(i);
我无法编译它,因为“动物类没有名为“ set_id”的成员”。 我可以为每个类创建所有这些方法,但这将毫无意义。 我敢肯定有一个快速的解决方案。 如果我为类“ Animal”创建了一个虚空的“ set_id(int)”,那么我将收到错误消息,即并非所有从animal继承的类都包含该方法。 因此,任何帮助将不胜感激。 谢谢
如果我为类“ Animal”创建了一个虚空的“ set_id(int)”,那么我将收到错误消息,即并非所有从animal继承的类都包含该方法。
我怀疑您将Animal :: set_id定义为纯虚拟的,如下所示:
virtual void set_id(int) = 0;
您真正想要的是在Animal
类中将其定义为虚拟方法,如下所示:
virtual void set_id(int _id) {id = _id};
另外, id
成员变量需要移到Animal
类而不是Turtle
编辑:
扩展答案以包含完整的代码:
class Animal
{
public:
Animal() : id(-1) {}
virtual ~Animal() {}
virtual void run() = 0;
virtual bool return_if_finished() = 0;
virtual float return_distance() = 0;
void set_id(int i) { id = i; }
private:
int id;
};
class Turtle :public Animal
{
public:
void run() {};
bool return_if_finished() { return true; };
float return_distance() { return 2.0; };
void a_friend() {};
};
class Snail :public Animal
{
public:
void run() {};
bool return_if_finished() { return false; };
float return_distance() { return 1.0; };
void broken_leg() {};
};
int main()
{
const int amount = 10;
Turtle turtles[amount];
Snail snails[amount];
for (int i = 0; i < amount; i++) {
turtles[i].set_id(i);
}
}
首先,使用:
Animal* turtles = new Turtle[amount];
Animal* snails = new Snail[amount];
是个坏主意。
turtles
和snails
的指针算法将基于Animal
的大小。 如果对所有不等于0
i
使用tutles[i]
,则会遇到未定义的行为。 对此可能存在一个SO问题。
请改用指针vector
。 初始化它们也将更加容易。
std::vector<Animal*> turtles(amount); = new Turtle[amount];
for(int i=0; i<amount; i++)
{
Turtle* tptr = new Turtle;
tptr->set_id(i);
turtles[i] = tptr;
}
更好的是,使用智能指针。
std::vector<std::shared_ptr<Animal>> turtles(amount); = new Turtle[amount];
for(int i=0; i<amount; i++)
{
Turtle* tptr = new Turtle;
tptr->set_id(i);
turtles[i] = std::shared_ptr<Animal>(tptr);
// Or
// turtles[i].reset(tptr);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.