我在处理以下代码中的继承问题时遇到问题:
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); 对不起,我是新来的
答案 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>
。您可能认为自己在此向量中插入了cat
或dog
个对象,但事实并非如此。如果它被定义为:
std::vector<Animal> ferme;
然后它只能包含Animal
个实例。
这就是为什么如果你使Animal
类抽象(make print
纯虚拟),它将无法构建。
这也是为什么如果您在print
中实施Animal
方法,它会忽略cat
和dog
中的打印方法。 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()