Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Хрисипп
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230

Виртуальный деструктор на MinGW v4.9.2

13.07.2016, 19:07. Показов 1459. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
не знаю как на прошлых версиях, но на этой не работает чисто виртуальный деструктор. проверялось самым обычным тестом
C++
1
2
3
4
5
6
class A{
  virtual ~A()=0;
};
A::~A(){cout<<"~";}
 
class B : public A {};
пишет Cmultiple definition of `A::~A()'|
в vs все работает. может где-то подкрутить нужно?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.07.2016, 19:07
Ответы с готовыми решениями:

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Виртуальный деструктор
Всем привет! Объясните пожалуйста новичку в ООП, вопрос чисто теоретический поэтому код не прилагаю. Мне сказали что если я в классе...

виртуальный деструктор
есть такой пример, у меня вопрос, почему здесь деструктор декларирован просто как деструктор, а не виртуальный (и является ли он в данном...

10
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.07.2016, 19:09
Хрисипп, а ключевое слово virtual написать?
0
 Аватар для Хрисипп
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 19:10  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
а ключевое слово virtual написать
это я написал, забыл в вопрос вписать
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.07.2016, 19:17
Цитата Сообщение от Хрисипп Посмотреть сообщение
multiple definition of `A::~A()'|
Это ошибка линкера. Если определение деструктора находится в заголовочном файле, который подключается в несколько единиц трансляции, то ошибка справедливая. MinGW здесь абсолютно прав, что это не компилирует.
Либо вынеси определение в отдельную единицу трансляции, либо сделай его inline.
0
 Аватар для Хрисипп
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 19:37  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
несколько единиц трансляции
да, работает если занести в мейн, но он подключается к другому хедеру, который в свою очередь к мейну
C++
1
2
3
4
5
6
7
8
9
10
// h1
#include "h2.h"
class A
 
//h2 
#include "h1.h"
class B:A
 
// cpp
#include "h2.h"
. и наоборот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// h1
#include "two.h"
#ifndef h1
#define h1
 
class A{
public:
virtual ~A()=0;
 
 
};
A::~A(){}
#endif
 
//h2
#ifndef h2
#define h2
#include "one.h"
using namespace std;
class B : A {};
 
#endif
это же подключение к одной единице трансляции
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.07.2016, 19:45
Хрисипп, поясни как ты понимаешь назначение строки номер 2 в h1? Почему он у тебя не под include-guard'ом?

Добавлено через 5 минут
Цитата Сообщение от Хрисипп Посмотреть сообщение
это же подключение к одной единице трансляции
Да, но у тебя проблема похоже из-за невнесенного в include-guard подключения. В итоге содержимое "расплодилось". И если объявлений в программе может быть сколько угодно, то определение сущности должно быть одно (правило одного определения).

Как ни крути - программа остается некорректной, даже если VS ее каким-то чудом собирает. Следовательно в любом случае - оставлять определение не-inline функции в заголовочном файле не стоит.
0
 Аватар для Хрисипп
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 19:48  [ТС]
DrOffset,
Цитата Сообщение от Хрисипп Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
// h1
#include "h2.h"
class A
//h2 
#include "h1.h"
class B:A
// cpp
#include "h2.h"
опять ошибся при написании ответа. там
C++
1
2
3
4
5
6
7
8
9
// h1
class A
 
//h2 
#include "h1.h"
class B:A
 
// cpp
#include "h2.h"
Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
расплодилось
тогда бы он сообщил, что deep include (это имеешь в виду?)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.07.2016, 19:53
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Хрисипп, ответ я тебе дал.
* В заголовочных файлах все содержимое должно быть в обрамлено include-guard`ом.
* В заголовочных файлах определений нешаблонных и не-inline функций быть не должно.
Собственно все.

Добавлено через 3 минуты
Цитата Сообщение от Хрисипп Посмотреть сообщение
тогда бы он сообщил, что deep include (это имеешь в виду?)
Не факт. Зависит от того есть ли циклическое включение. У тебя его нет, насколько ты смог показать.
1
 Аватар для Хрисипп
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 20:09  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
циклическое включение.
а это, случаем, не оно?
Цитата Сообщение от Хрисипп Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// h1
#include "h2.h"
#ifndef h1
#define h1
class A{
public:
virtual ~A()=0;
};
A::~A(){}
#endif
 
//h2
#ifndef h2
#define h2
#include "h1.h"
class B : A {};
#endif
 
//main cpp
#include "h1.h"
только защищенное
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.07.2016, 20:22
Цитата Сообщение от Хрисипп Посмотреть сообщение
а это, случаем, не оно?
Оно. Но оно разрывается include-guard`в h2.
Я же сказал тебе как делать правильно, в чем проблема-то? Зачем, кстати, вообще нужно циклически включать? Это в любом случае нехорошо.
0
 Аватар для Хрисипп
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 20:39  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем, кстати
осталось со времени, когда разбирался как устроены эти ifdef'ы. этот проект так и остался для сравнения с vs
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.07.2016, 20:39
Помогаю со студенческими работами здесь

Виртуальный деструктор и уничтожение объектов
Приветствую всех. вопрос наверное простой так, что не ругайтесь. столкнулся с проблемой освобождения памяти. вот пример кода: ...

Виртуальный деструктор, для чего нужен?
Я конечно понимаю, что Но объясните поподробнее и попонятнее для чего это нужно

Вопрос новичка про виртуальный деструктор
Если инициализировать указатель родительского класса адресом объекта дочернего класса и объявить в родительском классе деструктор...

Виртуальный деструктор вызывается два раза
Здравствуйте, у меня есть базовый и производный классы с динамическими массивами, я создаю массив указателей на базовый класс пытаюсь...

Почему виртуальный деструктор вызывается дважды?
Непонятно: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include&lt;string&gt; using namespace std; class base { ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru