Брутально и бессердечно о программировании и проектировании
ГлавнаяФорумАртПаттерныАнтипаттерныЗаметкиВопрос-ответКнигорецензииСправочная

19. Срезка и полиморфизм

Как вы думаете, копируется ли указатель на таблицу виртуальных функций при срезке? Что будет на экране?
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>

class base
{
public:

    virtual void foo()
    {
        std::cout << "base" << std::endl;
    }
};

class derived : public base
{
public:

    virtual void foo()
    {
        std::cout << "derived" << std::endl;
    }
};

void foo(base bs)
{
    bs.foo();
}

int main()
{
    base bs = derived();

    bs.foo();

    foo(derived());

    return 0;
}
Компилировать в Comeau
Правильный ответ.
На экране вы увидите:

base
base


Указатель на таблицу виртуальных функций не копируется. Он создается однажды при конструировании объекта и больше никогда не меняется.

Оглавление
Статистика
© 2007—2009 Inside C++ Коммерческие услугиКонтактная информация

продажа катеров moon ray. GPS карты. Aвтосигнализация. установка магнитолы. бесплатные программы. Заказчикам! Надежная стоматология. Быстро!. Электрические духовки, встраиваемая техника плита газовая.