Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
#1

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

28.12.2012, 03:23. Просмотров 670. Ответов 2
Метки нет (Все метки)

Данный вопрос взят с перечня вопросов на собеседование, смысл мне не совсем понятен, вот и решил его задать тут. Может кто понял суть самого вопроса и может на него ответить?
Честно говоря не припомню каких либо нюансов по поводу вызова виртуальных функций в данной ситуации.
К примеру есть следующий код:
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;};
};
Никаких нюансов тут не вижу, указал просто через доступ конкретный вызов метода того или иного класса.

или я просто неверно понял сам вопрос?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2012, 03:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какие нюансы в вызове виртуальных функций из конструктора и из деструктора? (C++):

Исправить код конструктора и деструктора - C++
Что-то не так с конструктором, так нельзя обнулять? нужно найти ошибку в деструкторе... #include &lt;iostream&gt; using namespace std; ...

Вызов конструктора и деструктора с использованием пула - C++
У меня есть некоторая область памяти (указатель на её начало и размер в байтах), часть которой необходимо превратить в объект. У объекта...

Ошибка при вызове деструктора - C++
Подскажите, что не так с этим деструктором? Просто выдает ошибку. Если его убираю то все идет норм. Если же оставляю, то куча всяких...

Ошибка при вызове деструктора - C++
Не могу дописать лабу... Надо создать 4 класса, описать поля и методы. Выкладываю исходники: Самый главный класс - Order. Выбивает ошибку в...

Ошибка при вызове деструктора - C++
Добрый вечер! Почему при вызове деструктора вылетает ошибка после компиляции кода? #include &lt;conio.h&gt; #include &lt;iostream&gt; #include...

Проблемы при вызове деструктора - C++
В процессе работы программы указатель на класс Dictionary,который является членом класса DictionaryManager,должен указывать на разные...

2
prazuber
110 / 110 / 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
1
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
28.12.2012, 04:31  [ТС] #3
спасибо, это в принципе я знаю, просто непонятен был сам смысл вопроса...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2012, 04:31
Привет! Вот еще темы с ответами:

Ошибка при вызове деструктора - C++
По окончании программы выдает ошибку #include &lt;string.h&gt; #include &lt;iostream&gt; using namespace std; class nik //объявление...

Ошибка при вызове деструктора - C++
Программа компилиться нормально,но после выполнения system(&quot;pause&quot;); выползает непонятное окно,и указывает на ошибку в деструкторе.В чем...

Ошибка при вызове деструктора - C++
Всем привет ! Есть класс class building { private: string *location_street; unsigned int *number_of_building; public...

Создать класс и проверить работу конструктора и деструктора - C++
Вечер добрый! Собственно вопрос, нужно определить класс и создать конструктор, деструктор, указатель на экземпляр класса + определить в...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru