Форум программистов, компьютерный форум CyberForum.ru

Какие нюансы в вызове виртуальных функций из конструктора и из деструктора? - C++

Восстановить пароль Регистрация
 
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
28.12.2012, 03:23     Какие нюансы в вызове виртуальных функций из конструктора и из деструктора? #1
Данный вопрос взят с перечня вопросов на собеседование, смысл мне не совсем понятен, вот и решил его задать тут. Может кто понял суть самого вопроса и может на него ответить?
Честно говоря не припомню каких либо нюансов по поводу вызова виртуальных функций в данной ситуации.
К примеру есть следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A {
 
public:
  A(){};
  virtual ~A(){};
  virtual void Show(){cout << "A()" << endl;};
};
 
class B : public A{
 
public:
  B(){A::Show();};
  ~B(){A::Show();};
  void Show(){cout << "B()" << endl;};
};
Никаких нюансов тут не вижу, указал просто через доступ конкретный вызов метода того или иного класса.

или я просто неверно понял сам вопрос?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2012, 03:23     Какие нюансы в вызове виртуальных функций из конструктора и из деструктора?
Посмотрите здесь:

C++ Ошибка при вызове деструктора
C++ Проблемы при вызове деструктора
C++ ошибка при вызове деструктора!
C++ Ошибка при вызове деструктора
C++ Исправить код конструктора и деструктора
C++ Вызов конструктора и деструктора с использованием пула
Ошибка при вызове деструктора C++
C++ Ошибка при вызове деструктора

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
28.12.2012, 03:52     Какие нюансы в вызове виртуальных функций из конструктора и из деструктора? #2
Я думаю, вы не совсем верно поняли вопрос. Взгляните на следующий код:
C++
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
#include <iostream>
 
class A
{
public:
  A() { f(); }
 
  void do_smth() { g(); }
 
  virtual void f() { std::cout << "in A::F \n"; }
  virtual void g() { std::cout << "in A::g \n"; }
};
 
class B : public A
{
public:
  B() : A() {}
 
  virtual void f() { std::cout << "in B::F \n"; }
  virtual void g() { std::cout << "in B::g \n"; }
};
 
int main()
{
    B b;
    b.do_smth();
}
Вывод:
Код
in A::F
in B::g
Как видим, в конструкторе не была вызвана B::f. Это произошло потому, что пока мы находимся в конструкторе A::A(), объект является чисто объектом класса A, и v_table ничего не знает перегрузку виртуальных функций в классе B. Аналогичная ситуация с деструктором, при вызове виртуальной функции в деструкторе будет вызвана текущая версия функции, так как наследник уже был разрушен и v_table был почищен от наследника.

Больше про вызов виртуальных функций в конструкторах: C++ FAQ Lite
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
28.12.2012, 04:31  [ТС]     Какие нюансы в вызове виртуальных функций из конструктора и из деструктора? #3
спасибо, это в принципе я знаю, просто непонятен был сам смысл вопроса...
Yandex
Объявления
28.12.2012, 04:31     Какие нюансы в вызове виртуальных функций из конструктора и из деструктора?
Ответ Создать тему
Опции темы

Текущее время: 01:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru