获取要继承的函数的函数

wro*_*ame 3 c++ inheritance

假设我有一个AnimalCow继承的基类,以及一个Barn包含Animal向量的类,让我们假设Animal类有一个虚函数scream(),它Cow会覆盖.

使用以下代码:

Animal.h

#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 */
Run Code Online (Sandbox Code Playgroud)

Cow.h

#ifndef _COW_H
#define _COW_H

#include "Animal.h"

class Cow: public Animal {
public:
    Cow() {}
    void scream() {cout << "MOOooooOOOOOOOO!!!" << endl;}
};

#endif  /* _COW_H */
Run Code Online (Sandbox Code Playgroud)

Barn.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 */
Run Code Online (Sandbox Code Playgroud)

最后是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);
}
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

aaaAAAAAAAAAAGHHHHHHHHHH!!! ahhh...
Run Code Online (Sandbox Code Playgroud)

我应该如何编写此获得MOOooooOOOOOOOO!!!(和任何其他类继承Animalscream()成为)呢?

fre*_*low 12

A std::vector<Animal>只能包含Animal对象,而不能包含Cow对象.

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

  1. Cow的临时对象是通过评估创建的Cow().
  2. animal由于您选择按值传递,因此该参数是从该临时母牛复制构造的.这animalAnimal临时牛的部分副本.这称为对象切片.
  3. 向量中的下一个元素是从参数复制构造的animal.现在你已经有了一头牛和两只额外的动物,但你只想要一头牛!
  4. 该参数animal因为insertBarn返回而被销毁.
  5. 暂时的母牛被摧毁,因为评估在行尾已达到分号(更准确地说:完整表达的评估已经完成).

这是什么教训?不要按价值传递动物,也不要按价值存放动物.运行时多态性需要一个间接级别.你可能想要一个std::vector<Animal*>std::vector<shared_ptr<Animal> >boost::ptr_vector<Animal>.

  • 我建议不要使用指针向量.而是使用boost:ptr_vector <Animal>这是一个专门用于保存指针和管理其生命周期的容器.或者使用Animal的共享指针向量. (4认同)
  • 嘿:所述`的boost :: ptr_vector <>`教程甚至使用"动物"层次结构及其实例(无牛,虽然):http://www.boost.org/doc/libs/1_35_0/libs/ptr_container/doc /tutorial.html (2认同)