Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;管理器对象和虚拟函数_C++_Virtual - Fatal编程技术网

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() { ... }