我有一个小问题,我无法处理 . 目前我正在研究一个关于动物之间马拉松的项目 . 我不得不使用多态,即使没有它也会更容易 . 这是我的代码示例:
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”继承的所有类只有三个相互的方法 . 他们也有一些只有他们需要的东西 .
如果我想在一个他们“运行”的方法中编写代码:
...
Animal* turtles = new Turtle[amount];
Animal* snails = new Snail[amount];
for(int i=0; i<amount; i++)
turtles[i].set_id(i);
我无法编译它,因为“类Animal没有名为”set_id“的成员 . 我可以为每个类创建所有这些方法,但这将毫无意义 . 我打赌有一个快速解决方案 . 如果我为“Animal”类创建一个虚拟void“set_id(int)”,那么我得到的错误信息是,并非所有从animal继承的类都包含该方法 . 所以任何帮助都将非常感激 . 谢谢
2 回答
我怀疑你将Animal :: set_id定义为 pure 虚拟,如下所示:
你真正想要的是在
Animal
类中将它定义为一个虚方法,如下所示:此外,
id
成员变量需要移动到Animal
类而不是Turtle
EDIT:
扩展答案以包含完整代码:
首先,使用:
是个坏主意 .
turtles
和snails
上的指针算法将基于Animal
的大小 . 如果对所有i
使用tutles[i]
不等于0
,则会遇到未定义的行为 . 关于这个问题,可能存在一个问题 .改为使用
vector
指针 . 初始化它们也会更容易 .更好的是,使用智能指针 .