2015-05-25 184 views
-4

我有一個繼承問題在下面的代碼處理中的問題:C++繼承虛擬純函數

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(); 
    } 

} 當我改變printvirtual void print()=0具有純虛函數,我有幾個彙編問題。而當我在Animal中定義虛函數時,不再考慮cat的打印函數。 分配抽象類類型的「動物」 ::新的((無效*)__ P)_TP的對象: 是貓:: print()函數在這裏一個 錯誤幾個其他錯誤中定義 下面的例子

(__a0); 對不起,我這裏是新的

+1

的是()定義貓::打印? – simon

+4

[無法重現](https://ideone.com/nrUscs)[無論是哪種情況](https://ideone.com/q5bFVM)。請始終提供[MCVE](http://stackoverflow.com/help/mcve)。 –

+1

如果您具體瞭解您在製作print()純虛擬時出現的錯誤,將會有所幫助。 – drescherjm

回答

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(); 
+0

我做到了,但如果我實現Animal :: print()cat :: print()不考慮,我如果我沒有錯誤虛擬方法沒有實現,即使我寫虛擬無效Animal :: print()= 0 –

0

它看起來就像在你farm類,你有std::vector<Animal>類型的成員。您可能會認爲您將此向量中的catdog對象插入,但您不是。如果它被定義爲:

std::vector<Animal> ferme; 

那麼它只能包含Animal實例。

這就是爲什麼如果你使Animal類抽象(使純print純虛擬)它將無法建立。

這也是爲什麼如果實現了print方法Animal它忽略catdog打印方法。您的farm::print方法中的it->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() 
+0

非常感謝!現在更清楚了 –