2014-02-07 4 views
5

В моем коде, я эти классы реализованы:C++: Вызов метода ребенка от родительского экземпляра

class A 
{ 
    public: 
    virtual int fun() { return 0; } 
} 

class B : public A 
{ 
    public: 
    virtual int fun() { return 1; } 
} 

И эти функции:

void operation(A a) 
{ 
    printf("%d\n",a.fun()); 
} 

int main() 
{ 
    B b; 
    operation(b); 
    return 0; 
} 

Как вы можете видеть, класс B наследует от A и реализует виртуальный унаследованный метод fun(). Основной класс вызывает функцию, которая принимает параметры A и вызывает метод fun(), с аргументом B в аргументе.

На исполнение я ожидаю, что будет напечатана строка "1", но это "0", которая (даже если это объект B, который передается operation()).

Мне нужно сделать это, потому что у меня есть несколько классов B (B1, B2 и т. Д.), И я хочу, чтобы функция operation() была общей. Мне не нужна реализация operation() в классе A, но если я объявляю operation() чистым виртуальным, компиляция завершится с ошибкой operation(), говоря, что я не могу создать экземпляр A (это вполне ожидаемо).

Я нашел много тем, говорящих о вызовах и наследования родительских/дочерних методов, но никто из них не говорил об этой проблеме точно.

Может кто-нибудь мне помочь?

Спасибо.

+0

Осторожно: для конструкции объекта по умолчанию вы не должны использовать круглые скобки. 'B b()' не называет 'B' по умолчанию c'tor, но объявляет функцию' b', которая не принимает аргументов и возвращает объект класса 'B'. –

+0

Это просто ошибка, которую я сделал, когда написал этот упрощенный пример кода – Vultrao

ответ

9

Вам нужно передать объект по ссылке или передать указатель

void operation(A& a) 

Поскольку вы передаете по значению, производный объект получает ОТРЕЗАННЫЙ - новый объект типа A создан в сферу действия функция.

+0

Теперь кажется очевидным, что вы это говорите. Хорошо работает сейчас, спасибо большое ^^! – Vultrao

Смежные вопросы