|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Возникла непонятка с виртуальными методами классов |
|
C/C++ - Возникла непонятка с виртуальными методами классов
|
![]() Ветеран Сообщения: 1328 |
В процессе изучения C++ возникла непонятка с виртуальными методами классов. Допустим есть три класса: A, B и C. Классы B и C публично наследуются от класса A. В классе A публичным объявлен виртуальный абстрактный метод Test(). В классах B и С этот метод переопределяется, причем в классе C данный метод объявлен уже как приватный. В функции MAIN создается массив указателей на объекты с типом A, элементам которого присваиваются адреса объектов с типом B и C. Далее, для всех объектов этого массива вызывается метод Test(). Меня удивляет то, что этот метод вызывается без проблем для всех элементов массива; напомню, что в этом массиве есть и элементы с типом C, в котором данный метод объявлен как приватный. Это вообще нормально?
З.Ы: Я просто эксперементирую... |
|
------- Отправлено: 00:11, 03-06-2010 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата Oleg_SK:
Права доступа к элементам класса проверяются на этапе компиляции, а в процессе выполнения просто происходит только обращение к элементу таблицы виртуальных функций. Если туда будет добавляться ещё и код проверки прав доступа, то программы будут работать ооочень медленно Цитата Oleg_SK:
![]() |
||
------- Отправлено: 05:56, 04-06-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Ветеран Сообщения: 1328
|
Профиль | Отправить PM | Цитировать Появился еще один вопрос: почему, если в классе есть виртуальные функции, компилятор автоматически не делает деструктор этого класса виртуальным? Интересно чем обосновывается такое поведение компилятора; трудно что-ли было это сделать???
|
------- Отправлено: 13:04, 04-06-2010 | #3 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата Oleg_SK:
мне вот больше нравится когда у интерфейса нет виртуального деструктора (ну не собираюсь я его через указатель разрушать) |
|
Отправлено: 18:18, 04-06-2010 | #4 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Oleg_SK, скорее всего, это недоработка конкретного компилятора
|
|
------- Отправлено: 05:20, 07-06-2010 | #5 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата El Scorpio:
class vA { virtual ~vA() {clog << "vA::~vA()\n";} }; class A { ~A() {clog << "A::~A()\n";} } class vB : public vA { ~vB() {clog << "vB::~vB()\n";} }; class B : public A { ~B() {clog << "B::~B()\n";} } // испытываем: vA* va = new vB(); delete va; // вызовет ~vB(), ~vA() A* a = new B(); delete a; // вызовет ~A() |
|
Отправлено: 09:35, 12-06-2010 | #6 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Конкурс - Работа с виртуальными жесткими дисками (VHD) в Windows 7 | OSZone | Microsoft Windows 7 | 0 | 15-12-2009 05:30 | |
Прочее - Как сделать сеть между двумя виртуальными машинами? | God-of-Chaos | Сетевые технологии | 2 | 26-06-2009 12:25 | |
C/C++ - Порядок построения классов | pva | Программирование и базы данных | 13 | 23-03-2009 14:36 | |
CD и DVD - Проблема с виртуальными дисками | zzzsergzzz | Программное обеспечение Windows | 5 | 01-02-2009 18:17 | |
Аудит доступа к объектам нестандартными методами | Sctl | Microsoft Windows NT/2000/2003 | 3 | 29-09-2008 18:06 |
|