C++ C++;管理器对象和虚拟函数
我试图用一个管理器对象来循环数组中的对象,并为每个对象调用虚拟函数。这是我到目前为止的代码,感谢一些非常有用的建议,它可以编译,但仍然没有像我希望的那样使用多态性。提前谢谢你给我的建议,可以给我指出正确的方向C++ C++;管理器对象和虚拟函数,c++,virtual,C++,Virtual,我试图用一个管理器对象来循环数组中的对象,并为每个对象调用虚拟函数。这是我到目前为止的代码,感谢一些非常有用的建议,它可以编译,但仍然没有像我希望的那样使用多态性。提前谢谢你给我的建议,可以给我指出正确的方向 #include <iostream> class avian{ private: static const int max_birds = 25; avian* birds[max_birds]; int num_birds; public:
#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;
}
#包括
禽类{
私人:
静态常数int max_=25;
鸟类*鸟类[max_birds];
国际鸟类;
公众:
鸟类():鸟类数量(0){}
虚拟鸟类{
对于(int i=0;i=max_birds){return false;}
鸟类[num_birds++]=b;
返回true;
}
void make_bird(){
对于(int i=0;imake_birds();
}
}
虚空产卵(){};
虚空鸟_noise(){};
};
土耳其类:公共鸟类{
公众:
空产卵常数
您没有:
调用delete pointer\u to\u avian将调用avian::~avian
,但正如编译器所说,它们不会传播到派生类-UB的析构函数
avian::lay_egs
已声明,但未定义。您的意思是使其成为纯虚拟函数吗?您已在每个派生类中重写了它
鸟类::鸟类噪音
-同上
你忘了在main
中删除我的火鸡
-你在泄漏内存
您没有:
调用delete pointer\u to\u avian将调用avian::~avian
,但正如编译器所说,它们不会传播到派生类-UB的析构函数
avian::lay_egs
已声明,但未定义。您的意思是使其成为纯虚拟函数吗?您已在每个派生类中重写了它
鸟类::鸟类噪音
-同上
你忘了在main
中删除我的火鸡
-你在泄漏内存
基本虚拟方法未标记为常量,但派生类中的方法是常量,因此不会重写它们
经验法则是使用override关键字以避免此类错误您的基本虚拟方法未标记为常量。但派生类中的方法是常量。因此它们不会被重写
经验法则是使用override关键字以避免此类错误编译器告诉您“删除多态类类型avian
且具有非虚拟析构函数的对象可能会导致未定义的行为”。您是否尝试将虚拟析构函数添加到类avian
?是的。刚刚更改了。现在它可以编译。但它仍然没有从我的虚拟函数中提供任何输出。编译器告诉您“删除具有非虚拟析构函数的多态类类型avian
的对象可能会导致未定义的行为”。您是否尝试将虚拟析构函数添加到类avian
?是的。刚刚更改了。现在它可以编译。但它仍然没有从我的虚拟函数中提供任何输出。好的。我更改了析构函数,使两个函数成为纯虚拟函数。这清除了我所有的错误。非常感谢您的帮助!好的,我添加了删除。我是omewhat在如何实现多态性方面丢失了什么。我想在派生类中使用我的虚拟函数,但我没有正确地组合各个部分。那么我应该在每个类中添加一个析构函数(即~turkey)?@cheovy但为什么要为每只鸟存储鸟?这是一个异常现象…这些析构函数不是必需的,编译器将生成它们。我试图做的是让一个管理器类存储指向“avian”的指针数组并将我的bird添加到数组中,同时跟踪添加了多少。好的。我更改了析构函数,使这两个函数成为纯虚拟函数。这清除了我所有的错误。非常感谢您的帮助!好的,我添加了delete。我对如何实现多态性有些迷茫。我想将虚拟函数用于派生类,但我没有正确地组合这些片段。那么我应该为每个类(即~turkey)添加一个析构函数吗?@cheovy但为什么要为每个鸟存储鸟?这是一个异常现象……这些析构函数不是必需的,编译器将生成它们。我尝试的是让一个管理器类存储指向“avian”的指针数组并将我的鸟添加到数组中,同时跟踪添加的鸟数。
virtual ~avian() { ... }