繁体   English   中英

C ++多态性。 方法

[英]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];

是个坏主意。

turtlessnails的指针算法将基于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM