Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
SkySp
Зарегистрирован: 07.06.2005 Сообщения: 5 Откуда: Москва. Глубокое подполье.
|
Добавлено: Ср Июн 08 2005 18:57 Заголовок сообщения: Виртуальные функции в С++ |
|
|
Код: | #include <iostream.h>
class A{
protected:
int a;
public:
A(){a=0;}
A(int n){a=n;}
virtual void show(){cout<<"a";}
};
class B: public A{
protected:
int b;
public:
B(){b=0;}
B(int n){b=n;}
void show(){cout<<"b";}
};
class C: public B{
private:
int c;
public:
C(){c=0;}
void show(){cout<<"c";}
};
void main(){
A* pa, obja=5;
B* pb, objb;
C objc;
pa=&objb; pa->show();
pb=&objc; pb->show();
pa=&objc; pa->show();
} |
На экран вылезет : bcc
После выплнения следующей программы механизм переопределения стал мне... непонятен...
Строка: "pa=&objb; pa->show();" определяет доступ к наследуемым данным (обращаемся к части В наследуемой из А). Если бы в А функция show() была бы описана невиртуальной, то в результате выполнения строки вызвалась бы A::show(). Но в данном примере вызовется B::show(). И это логично.
Аналогичное рассуждение и для строки "pa=&objc; pa->show();", в результате которой вызывается C::show().
Но если мы будем обращатся к части С наследуемой из В...
"pb=&objc; pb->show();" то, по логике вещей, должна вызваться B::show(), т.к. она описана невиртуальной, НО на экран выводится "c" (bcc, а не bbc)... значит все равно вызывается C::show().
Кто-нибыдь может это объяснить, пожалста! _________________ Пять минут на перекур... две на все остальное... |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Чт Июн 09 2005 12:16 Заголовок сообщения: respect |
|
|
Занятный факт. Видимо, атавизмы виртуальности дают о себе знать. Но явно некорректное поведение, причём это имеет место и в MSVC++, и в gcc.
-----------------
respect |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Пт Июн 17 2005 09:04 Заголовок сообщения: |
|
|
Интересно, не inline функции себя так же ведут? |
|
Вернуться к началу |
|
|
|