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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Алгоритм Дейкстры. Консольное приложение http://www.cyberforum.ru/cpp-beginners/thread748639.html
Помогите, помогите, помогите кто чем может, пожалуйста!.. срочно пипец вообще как нужна программа на плюсах, реализующая алгоритм Дейкстры именно в виде консольного приложения...сама никак не разберусь( нуб.
C++ Перевести из с++ в си Переведите из c++ в си пожалуйста #include <string> #include <sstream> #include <vector> #include <iostream> using namespace std; //Ввести строку. Вывести пословно вместе со счетчиком повторений этого слова. //----------------------------------------------------------------------------- int main() { http://www.cyberforum.ru/cpp-beginners/thread748630.html
C++ Функция, изменяющая число, переданное ей в качестве параметра
Разработайте функцию Invert, которая возвращает число, полученное записью всех цифр некоторого натурального N в обратном порядке. Т.е., если функция принимает в качестве параметра число 75432, то возвращает число 23457.
C++ Работа с файлом
#include <fstream> #include <iostream> #include<clocale> using namespace std; int main() { setlocale(LC_ALL, "rus"); char m ; int n;
C++ Массивы,найти строку наибольшей длины http://www.cyberforum.ru/cpp-beginners/thread748605.html
Вводят массив строк символов. Необходимо найти строку наибольшей длины и увеличить все остальные строки в массиве до длины наибольшей строки, используя символ "!".
C++ Как правильно написать тест на ошибки? Почему у меня выводится вот так, а не так как надо? http://s05.***********/i178/1212/d8/4804029627b7.jpg int main(int j) { int* b; int n; int p = 1; char answer; подробнее

Показать сообщение отдельно
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
28.12.2012, 03:52     Какие нюансы в вызове виртуальных функций из конструктора и из деструктора?
Я думаю, вы не совсем верно поняли вопрос. Взгляните на следующий код:
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
 
Текущее время: 06:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru