gpt4 book ai didi

C++ 管理器对象和虚函数

转载 作者:行者123 更新时间:2023-11-28 00:08:25 25 4
gpt4 key购买 nike

我正在尝试使用管理器对象循环遍历数组中的对象并为每个对象调用虚函数。到目前为止,这是我的代码,多亏了一些非常有用的建议,它可以编译,但仍然没有按照我想要的方式使用多态性。预先感谢任何可以为我指明正确方向的提示。

#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;
}

最佳答案

  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_turkeymain - 你正在泄漏内存。

关于C++ 管理器对象和虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com