代码之家  ›  专栏  ›  技术社区  ›  wrongusername

获取要调用的继承函数的函数

  •  3
  • wrongusername  · 技术社区  · 16 年前

    假设我有一个基类 Animal 从哪个班级 Cow Barn 包含 动物 scream() ,其中 牛 覆盖。

    代码如下:

    #ifndef _ANIMAL_H
    #define _ANIMAL_H
    #include <iostream>
    using namespace std;
    
    class Animal {
    public:
        Animal() {};
        virtual void scream() {cout << "aaaAAAAAAAAAAGHHHHHHHHHH!!! ahhh..." << endl;}
    };
    
    #endif  /* _ANIMAL_H */
    

    #ifndef _COW_H
    #define _COW_H
    
    #include "Animal.h"
    
    class Cow: public Animal {
    public:
        Cow() {}
        void scream() {cout << "MOOooooOOOOOOOO!!!" << endl;}
    };
    
    #endif  /* _COW_H */
    

    谷仓

    #ifndef _BARN_H
    #define _BARN_H
    
    #include "Animal.h"
    #include <vector>
    
    class Barn {
        std::vector<Animal> animals;
    
    public:
        Barn() {}
        void insertAnimal(Animal animal) {animals.push_back(animal);}
        void tortureAnimals() {
            for(int a = 0; a < animals.size(); a++)
                animals[a].scream();
        }
    };
    
    #endif  /* _BARN_H */
    

    最后是main.cpp

    #include <stdlib.h>
    #include "Barn.h"
    #include "Cow.h"
    #include "Chicken.h"
    
    /*
     * 
     */
    int main(int argc, char** argv) {
        Barn barn;
        barn.insertAnimal(Cow());
        barn.tortureAnimals();
        return (EXIT_SUCCESS);
    }
    

    aaaAAAAAAAAAAGHHHHHHHHHH!!! ahhh...
    

    我应该如何编写代码来获取 MOOooooOOOOOOOO!!! 动物 欲望 尖叫()

    3 回复  |  直到 16 年前
        1
  •  2
  •   Amardeep AC9MF    16 年前

    #ifndef _BARN_H
    #define _BARN_H
    
    #include "Animal.h"
    #include <vector>
    
    class Barn {
        std::vector<Animal *> animals;
    
    public:
        Barn() {}
        void insertAnimal(Animal *animal) {animals.push_back(animal);}
        void tortureAnimals() {
            for(int a = 0; a < animals.size(); a++)
                animals[a]->scream();
        }
    };
    
    
    int main(int argc, char** argv) {
        Barn barn;
        barn.insertAnimal(new Cow());
        barn.tortureAnimals();
    
        // should clean up barn contents here...
    
        return (EXIT_SUCCESS);
    }
    
        2
  •  12
  •   David Rodríguez - dribeas    16 年前

    A std::vector<Animal> 只能包含 Animal Cow 物体。

    当你说 barn.insertAnimal(Cow()); :

    1. Cow() .
    2. animal 是从临时cow构造的副本,因为您选择按值传递它。这个 动物 动物 -临时奶牛的一部分。这叫做 .
    3. 向量中的下一个元素是由参数构造的 动物
    4. 参数 动物 是因为 insertBarn

    运行时多态性需要一定级别的间接寻址。你可能想要一个 std::vector<Animal*> std::vector<shared_ptr<Animal> > boost::ptr_vector<Animal> .

        3
  •  2
  •   egrunin    16 年前

    Cow 正在被制成 Animal

    class Barn {
        std::vector<Animal *> animals;
    
        void insertAnimal(Animal *animal) {animals.push_back(animal);}
    
        void tortureAnimals() {
            for(int a = 0; a < animals.size(); a++)
                animals[a]->scream();
        }
    };
    
    int main(int argc, char** argv) {
        Barn barn;
        Cow *c = new Cow();
        barn.insertAnimal(c);
        barn.tortureAnimals();
        /* delete them here... */
    }