Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Возникла непонятка с виртуальными методами классов

Ответить
Настройки темы
C/C++ - Возникла непонятка с виртуальными методами классов

Аватара для Oleg_SK

Ветеран


Сообщения: 1328
Благодарности: 144


Конфигурация

Профиль | Отправить PM | Цитировать


В процессе изучения C++ возникла непонятка с виртуальными методами классов. Допустим есть три класса: A, B и C. Классы B и C публично наследуются от класса A. В классе A публичным объявлен виртуальный абстрактный метод Test(). В классах B и С этот метод переопределяется, причем в классе C данный метод объявлен уже как приватный. В функции MAIN создается массив указателей на объекты с типом A, элементам которого присваиваются адреса объектов с типом B и C. Далее, для всех объектов этого массива вызывается метод Test(). Меня удивляет то, что этот метод вызывается без проблем для всех элементов массива; напомню, что в этом массиве есть и элементы с типом C, в котором данный метод объявлен как приватный. Это вообще нормально?

З.Ы: Я просто эксперементирую...

-------
Здесь вместо "Спасибо" принято щелкать на "Полезное сообщение" у тех постов, которые вам помогли, или показались полезными.


Отправлено: 00:11, 03-06-2010

 

ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Цитата Oleg_SK:
напомню, что в этом массиве есть и элементы с типом C, в котором данный метод объявлен как приватный. »
Ну и что? Указатели всё равно ведь тип А имеют,*а там метод объявлен публичным.
Права доступа к элементам класса проверяются на этапе компиляции, а в процессе выполнения просто происходит только обращение к элементу таблицы виртуальных функций. Если туда будет добавляться ещё и код проверки прав доступа, то программы будут работать ооочень медленно

Цитата Oleg_SK:
Это вообще нормально? »
Поведение программы - нормальное. Ненормален здесь эксперимент

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:56, 04-06-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Oleg_SK

Ветеран


Сообщения: 1328
Благодарности: 144

Профиль | Отправить PM | Цитировать


Появился еще один вопрос: почему, если в классе есть виртуальные функции, компилятор автоматически не делает деструктор этого класса виртуальным? Интересно чем обосновывается такое поведение компилятора; трудно что-ли было это сделать???

-------
Здесь вместо "Спасибо" принято щелкать на "Полезное сообщение" у тех постов, которые вам помогли, или показались полезными.


Отправлено: 13:04, 04-06-2010 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Oleg_SK:
трудно что-ли было это сделать »
а трудно его виртуальным объявить?
мне вот больше нравится когда у интерфейса нет виртуального деструктора (ну не собираюсь я его через указатель разрушать)
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:18, 04-06-2010 | #4


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Oleg_SK, скорее всего, это недоработка конкретного компилятора

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 05:20, 07-06-2010 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата El Scorpio:
Oleg_SK, скорее всего, это недоработка конкретного компилятора »
El Scorpio, Это не недоработка, это так и нужно (читайте RFC). Виртуальный деструктор должен быть объявлен специально. Чтобы он объявлялся автоматически, нужно чтобы он был объявлен виртуальным в одном из базовых классов.
Код: Выделить весь код
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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Возникла непонятка с виртуальными методами классов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Конкурс - Работа с виртуальными жесткими дисками (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




 
Переход