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

Как удалить объект по указателю на базовый класс? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ (CИ)26. Определить сколько раз последовательность из N произвольных чисел меняет знак http://www.cyberforum.ru/cpp-beginners/thread277763.html
(СИ)Определить сколько раз последовательность из N произвольных чисел меняет знак
C++ Массивы Помогите решить задачу! Генератором сгенерировать массив на сто элементов чисел в диапазоне от 0 до 20. Каждый элемент - это количество выбоин на участке 100 метров дороги. Если до 10-и выбоин - хорошая дорога Рисуется символами *. После - плохая - символами #, Если подряд встречаются 3 и более плохих участков, этот сектор отдается для ремонта бригаде со спецтехникой. Рисуется символом $ ... http://www.cyberforum.ru/cpp-beginners/thread277760.html
C (СИ) Записать число в обратном порядке
записать число в обратном порядке например 12345 - 54321(СИ)
C++ не могу разобраться с ветвлением
есть задача:Вычислить y = x4+7x2+10/x, для x с шагом h = 0.01. решение: #include <iostream.h> #include <conio.h> int main() { // Программа печати таблицы функции double x=2,y; //Объявление переменных float h=0.01; cout <<"Программа печати таблицы функции y = x^4 + 7x^2 + 10/x\n"; BeginCycle: y = x*x*(x*x+7)+10/x; //Вычисление результата
C++ Интересно где же я запутал код http://www.cyberforum.ru/cpp-beginners/thread277731.html
Собственно сижу щас химичу с двумерными массивами и решил сложить сумму каждой строки отдельно, самое интересное что получилось, но к сожалению складывается только 1ая строка, а дальше ( 2ая и 3яя строка) я просто не понимаю откуда берутся цифры =) Собственно вот код #include <iostream> #include <math.h> #include <stdio.h> using namespace std; int main(int argc, char* argv)
C++ прграммка на C++ Здравствуйте! Не могли бы вы мне помочь? Нужно написать программу на C++ : Даны целые массивы A, B и значения R и F. Каждый массив пpеобpазовать по пpавилу: если отpицательных элементов в массиве больше 2, то пеpвый по поpядку отpицательный компонент заменить на значение R (для массива А) и значение F (для массива B). В пpотивном случае массив оставить без изменений. Я написал так, что... подробнее

Показать сообщение отдельно
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
06.05.2011, 23:00     Как удалить объект по указателю на базовый класс?
У меня возник один вопрос, вот в книге я прочёл:


"В создании и уничтожении объектов имеется одно существенное отличие. Создавая объект, мы всегда точно знаем, какому классу он принадлежит. При уничтожении это не всегда известно.
C++
1
2
3
4
5
6
7
Item* itptr;
if (type == "book")
     itptr = new Book();
else
     itptr = new Magazin();
. . .
delete itptr;
Во время компиляции неизвестно, каким будет значение переменной type и, соответственно, объект какого класса удаляется операцией delete. Поэтому компилятор может вставить вызов только деструктора базового класса."


А в этой теме мы наблюдаем, что для удаления производного класса НЕОБЯЗАТЕЛЬНО наличие виртуального деструктора. Конкретнее, здесь: (сообщение N 5)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
#define I_D std::cout << __FUNCTION__ << std::endl;
 
class C
{
public:
   C(){ I_D; }
   ~C(){ I_D; }
};
 
class A
{
public:
  A()
  {
     I_D;
  }
  virtual ~A()
  {
     I_D;
  }
};
 
class B : public A{
public:
  B()
  {
     I_D;
  }
  ~B()
  {
     I_D;
  }
private:
  C m_c;
};
 
int main()
{
  A* a = new B;
  A* arr[10];
  arr[0] = new A;
  arr[1] = new B;
  delete arr[0];
  delete arr[1];
}
То есть чтобы всё было ОК, необходимо чтобы тут
C++
1
2
3
4
5
6
7
8
9
10
class B : public A{
public:
  B()
  {
     I_D;
  }
  ~B()
  {
     I_D;
  }
Было так:
C++
1
2
3
4
5
6
7
8
9
10
class B : public A{
public:
  B()
  {
     I_D;
  }
  virtual ~B()
  {
     I_D;
  }
Но деструктор класса B благополучно вызывается и БЕЗ ОБЪЯВЛЕНИЯ его виртуальным. Вот, хочу узнать, в чём дело- автор книги ошибся или ещё что.

Добавлено через 44 секунды
Ещё в книге написано:
"Для того чтобы все необходимые деструкторы были вызваны, нужно воспользоваться виртуальным механизмом – объявить деструктор как в базовом классе, так и в производном, как virtual. "
 
Текущее время: 15:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru