2015-01-22 1 views
2
class A; 
{ 
private: 
    int a; 
public: 
    virtual int getV() { return a; } 
} a; 

class C : public A; 
{ 
private: 
    int c; 
public: 
    int getV() { return c; } 
} c; 

class D 
{ 
public: 
    A* liste; 
} d; 

Память для списка может быть выделена и A :: a и C :: c имеют значения. Теперь, если я положил c в D :: liste [0] и выдал егоПолиморфизм, виртуальные методы, C++

cout << d.liste[0].getV(); 

распечатывает A :: a. Почему он не распечатывает C :: c, хотя я объявил A :: getV() виртуальным?

ответ

3

Полиморфизм C++ работает только для указателей и ссылок. liste[0] имеет тип A, а не A* или A&, поэтому звонок liste[0].getV() фактически не отправляется. Он просто называет A::getV().

+0

спасибо! каково было бы лучшее/общее решение этой проблемы? – LPrc

+1

@LPrulzcrossover Если вы хотите иметь полиморфное поведение, вы должны использовать ссылки или указатели. Например, 'A * ptr = & c; ptr-> getV() '; будет печатать 'C :: c'. – kraskevich

+0

Для меня как VS10 express, так и gcc 4.4.7, выполняйте полиморфизм также для массивов. означает: 'ptr [0] .getv()' дает то же значение, что и 'ptr-> getv()'. неясно, в чем проблема. нужно дать полный нерабочий код, но я думаю, он пытался добраться от объекта A до C ... – SHR

1

Я написал программу, как это и получение правильного результата, как ожидалось

#include <iostream> 
using namespace std; 

class A 
{ 
private: 
    int a; 
public: 
    virtual int getV() { cout<<"A";return a; } 
}; 

class C : public A 
{ 
private: 
int c; 
public: 
    virtual int getV() { cout<<"C";return c; } 
}; 

class D 
{ 
    public: 
    A* liste[2]; 
}; 

int main() 
{ 
    D d; 
    d.liste[0]=new C(); 
    d.liste[1]=new A(); 
    cout<<d.liste[0]->getV();  
    return 0; 
} 

Просто взгляните на него ..

+0

спасибо! В 'D' вы также можете использовать' A ** liste', чтобы сохранить его динамичным, не так ли? – LPrc

+1

да, мы можем это сделать .. но я просто говорю, что работала программа. –