C ++继承虚拟纯函数

时间:2015-05-25 15:01:38

标签: c++ inheritance virtual

我在处理以下代码中的继承问题时遇到问题:

class Animal{
public:
    Animal(int age);
   ~Animal();
    virtual void print();  // problem here     
};

class cat : public Animal
{
public:
    cat(int age);
    ~cat();
    virtual void print();
};
cat::cat(int age) : Animal(age){}
cat::~cat(){}
void cat::print(){
    std::cout<<"I'm a cat "<<"My age is"<<this->getAge()<<std::endl;
}

int main (){
        farm f;
        cat c(3);
        dog d(4);
        f.add(c);
        f.add(d);
        c.print();
        f.print();
        std::cout<<f.getNa()<<std::endl;
        return 0;
    }
farm::farm(){

    this->na=0;
 }
void farm::add(Animal& a){
    if(this->na<10){
    this->ferme.push_back(a);
    this->na+=(*this).na;
    }
    else std::cout<<"la ferme est pleine"<<std::endl;
}
farm::~farm(){}
void farm::remove(){
    this->ferme.pop_back();
}
int farm::getNa(){
    return this->na;
}
void farm::print(){

    for(std::vector<Animal>::iterator it = this->ferme.begin();it !=this-   >ferme.end();++it){
        std::cout<<"test"<<std::endl;
        it->print();
    }

} 当我将print更改为virtual void print()=0以获得纯虚函数时,我有几个编译问题。而当我在Animal中定义虚拟函数时,不再考虑cat的打印函数。 是cat :: print()已定义 这是一个例子

其中几个错误之一 错误:       分配抽象类类型'Animal'的对象                 :: new((void *)__ p)_Tp(__ a0); 对不起,我是新来的

2 个答案:

答案 0 :(得分:0)

您应该在cat.cpp类中定义virtual void print()。

//Example for cat.cpp class
#include "cat.h"
cat:cat(int age){
cat::age = age;
}
void cat::print(){
std::cout << getAge();

答案 1 :(得分:0)

farm班级中,您的成员类型为std::vector<Animal>。您可能认为自己在此向量中插入了catdog个对象,但事实并非如此。如果它被定义为:

std::vector<Animal> ferme;

然后它只能包含Animal个实例。

这就是为什么如果你使Animal类抽象(make print纯虚拟),它将无法构建。

这也是为什么如果您在print中实施Animal方法,它会忽略catdog中的打印方法。 it->print()方法中的farm::print调用已应用于Animal个实例,因此正确的调用方法是来自Animal的方法。

虚拟调度机制仅适用于指针或引用,例如:

Animal *a1 = new cat(10);
a1->print(); // will call cat::print()

cat c1(10);
Animal &a2 = c1;
a2.print(); // will call cat::print()

Animal a3 = c1; // like you do when inserting in the vector
a3.print(); // will call Animal::print()