2016-04-01 10 views
0

У меня возникла проблема с концепцией, включающей наследование и массивы производных объектов. Я создал массив указателей и заполнил его либо базовым классом, либо производным классом в зависимости от того, является ли позиция массива четной или нечетной. Однако, когда я вызываю функцию birdType, все объекты в массиве используют функцию базового класса, даже если объекты массива с четным номером должны использовать переопределенную функцию версии. Я попытался использовать механизм виртуальных вызовов для базовой функции, но это, похоже, сбой программы.Использование переопределенных функций в массиве базового класса

Код в вопросе:

class bird{ 
public: 
    void birdType(){cout<<"I am a bird.\n";} 
}; 
class sparrow:public bird 
{ 
    void birdType() { cout <<"I am a sparrow.\n";} 
}; 

int main(){ 
    bird *collection[5]; 
    for (int i = 0; i < 5; ++i) { 
     if (i % 2 != 0) 
     { 
      collection[i] = new bird; 

     } 
     else if (i % 2 == 0) 
     { 
      collection[i] = new sparrow; 
     } 



    } 
    for(int j=0;j<5;++j)collection[j]->birdType();; 
} 

и выходной ток:

I am a bird 
I am a bird 
I am a bird 
I am a bird 
I am a bird 

ответ

0

Вам нужно сделать функцию birdType() в своем базовом классе (птица) виртуальная. Если это не виртуально, вы не получите желаемого наследования.

virtual void birdType(){cout<<"I am a bird.\n";} 

должен сделать трюк.

+0

эй спасибо за быстрый ответ, я, должно быть, сделал что-то другое, когда переписал это, потому что виртуальный, похоже, работает сейчас. заранее моя программа сработала бы с виртуальной базой. – LOUDNOODLES

+0

@ LOUDNOODLES Рад это слышать! Разумеется, принимая это как ответ? – mwm314