C ++ Manager对象和虚函数

时间:2015-12-11 22:59:18

标签: c++ virtual

我试图用一个管理器对象来绕过数组中的对象并调用每个对象的虚函数。到目前为止,这是我的代码,由于一些非常有用的建议,它编译但仍然没有按照我想要的方式使用多态。提前感谢任何能够指引我正确方向的提示。

#include <iostream>

class avian{
private:
    static const int max_birds = 25;
    avian* birds[max_birds];
    int num_birds;
public:
    avian() : num_birds(0){}

    virtual ~avian() {
        for (int i = 0; i < num_birds; ++i) { delete birds[i]; }
    }

    bool add(avian* b){
        if (num_birds >= max_birds){ return false; }

    birds[num_birds++] = b;
    return true;
    }

    void make_bird(){
        for (int i = 0; i< num_birds; ++i){birds[i]->make_bird();
        }
    }

    virtual void lay_eggs(){} ;

    virtual void bird_noise(){} ;

};

class turkey : public avian{
public:
    void lay_eggs() const{ std::cout << "000\n"; }
    void bird_noise() const { std::cout << "Gobble Gobble Gobble!\n"; }
};

class chicken : public avian {
public:
    void lay_eggs() const { std::cout << "OOOOO\n"; }
    void bird_noise() const { std::cout << "Bock Bock Bock!\n"; }
};

class quail : public avian{
public:
    void lay_eggs() const { std::cout << "ooooooooo\n"; }
    void bird_noise() const { std::cout << "Chirr Chirr Chirr!\n"; }
};

int main(){
    avian* my_turkey = new turkey;
    my_turkey->make_bird();

    my_turkey->lay_eggs();
    my_turkey->bird_noise();

    delete my_turkey;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

  1. 您没有virtual base class destructor

    virtual ~avian() { ... }
    

    调用delete pointer_to_avian will将调用avian::~avian,但它们不会传播到派生类的析构函数 - UB,正如编译器所说。

  2. avian::lay_eggs已声明,但未定义。你的意思是让它成为纯虚函数吗?你已经在每个派生类中重写它。

  3. avian::bird_noise - 与上述相同
  4. 你忘了delete my_turkey main - 你正在泄露记忆。

答案 1 :(得分:1)

您的基本虚拟方法未标记为const。但是派生类中的方法是const。所以他们没有被覆盖。

经验法则是使用override关键字以避免此类错误