首页 文章

C多态性 . 方法

提问于
浏览
2

我有一个小问题,我无法处理 . 目前我正在研究一个关于动物之间马拉松的项目 . 我不得不使用多态,即使没有它也会更容易 . 这是我的代码示例:

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 回答

  • -2

    如果我为“Animal”类创建了一个虚拟void“set_id(int)”,那么我得到的错误信息是并非所有从animal继承的类都包含该方法 .

    我怀疑你将Animal :: set_id定义为 pure 虚拟,如下所示:

    virtual void set_id(int) = 0;
    

    你真正想要的是在 Animal 类中将它定义为一个虚方法,如下所示:

    virtual void set_id(int _id) {id = _id};
    

    此外, id 成员变量需要移动到 Animal 类而不是 Turtle

    EDIT:

    扩展答案以包含完整代码:

    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);
        }
    }
    
  • 2

    首先,使用:

    Animal* turtles = new Turtle[amount];
    Animal* snails = new Snail[amount];
    

    是个坏主意 .

    turtlessnails 上的指针算法将基于 Animal 的大小 . 如果对所有 i 使用 tutles[i] 不等于 0 ,则会遇到未定义的行为 . 关于这个问题,可能存在一个问题 .

    改为使用 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);
    }
    

相关问题