Ключевое слово виртуальной функции - PullRequest
1 голос
/ 14 августа 2011

Есть ли разница между объявлением унаследованной виртуальной функции в дочернем классе с ключевым словом "virtual" или без , учитывая, что я хочу назвать fun соответствующим типу моих объектов.Посмотрите на комментарии.

#include <cstdio>
struct A{
    int a;
    A():a(5){}
    virtual int fun(){return a+1;}
};
struct B: public A{
    virtual int fun(){return a+5;} //I put virtual here
//  int fun(){return a+5;} // Any difference if I put virtual before or not?
};
int main(){
    B obj;
    printf("%d\n", static_cast<A>(obj).fun()); // A::fun() called. Why?
    printf("%d\n", static_cast<A&>(obj).fun()); // B::fun() called. As expected
    printf("%d\n", static_cast<A*>(&obj)->fun()); // B::fun() called. As expected
    printf("%d\n", static_cast<A>(B()).fun()); // A::fun() again. Why?
//  printf("%d\n", static_cast<A&>(B()).fun()); //invalid_cast error. Why? 
    printf("%d\n", static_cast<A*>(&B())->fun()); //It works! B::fun() call
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 14 августа 2011

Переопределяющие функции в производных классах неявно объявляются «виртуальными», если соответствующая функция в базовом классе является виртуальной.Просто убедитесь, что вы получили точно такую ​​же подпись, или вы можете случайно скрыть оригинальную функцию и объявить новую!

В C ++ 0x не стесняйтесь свободно использовать спецификатор override.

Ваши два "Почему?"вопросы из-за нарезки ;вы создаете новые, нарезанные на копии объекты типа A.Обратите внимание, что в B x; static_cast<A>(x); приведение к действию совпадает с высказыванием A(x).

3 голосов
/ 14 августа 2011

Хранение ключевого слова virtual перед переопределенной функцией-членом в производном классе не является обязательным. Полиморфизм во время выполнения работает только для указателей или ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...