Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2010, 23:15   #1
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию Абстрактный виртуальный деструктор в базовом классе.

Можно ли сделать сабж? Что-то у меня не получается... Если сделать этот виртуальный деструктор не абстрактным, то программка компилится и работает нормально. Если же я делаю попытку сделать этот виртуальный деструктор абстрактным (не забыв закоментить код реализации деструктора в базовом классе), то программа перестает компилироваться. Visual Studio 2010 ругается следующим образом:
1>Three.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall One::~One(void)" (??1One@@UAE@XZ) referenced in function "public: virtual __thiscall Three::~Three(void)" (??1Three@@UAE@XZ)
1>Two.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall One::~One(void)" (??1One@@UAE@XZ)
1>C:\Documents and Settings\Admin\Мои документы\Visual Studio 2010\Projects\SysFiles\Debug\SysFil es.exe : fatal error LNK1120: 1 unresolved externals

Последний раз редактировалось Oleg_SK; 14.06.2010 в 23:18.
Oleg_SK вне форума Ответить с цитированием
Старый 15.06.2010, 02:13   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

А зачем???
Деструктор базового класса так или иначе будет вызван.
Carbon вне форума Ответить с цитированием
Старый 15.06.2010, 05:06   #3
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Carbon
Собственно базовый класс у меня служит в качестве интерфейса, т.е. содержит только абстрактные виртуальные методы и соответственно деструктор в нем не нужен, по этому я хотел его тоже сделать абстрактным... Как я понял, этого сделать нельзя, верно?
Oleg_SK вне форума Ответить с цитированием
Старый 15.06.2010, 05:17   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Oleg_SK Посмотреть сообщение
Carbon
Собственно базовый класс у меня служит в качестве интерфейса, т.е. содержит только абстрактные виртуальные методы и соответственно деструктор в нем не нужен, по этому я хотел его тоже сделать абстрактным... Как я понял, этого сделать нельзя, верно?
В плюсах нету интерфейсов, как в некоторых других языках. Тут их роль играют обычные классы, в которых есть только чисто виртуальные функции. Но в отличие от нормальных интерфейсов это настоящий класс, поэтому хотите ли вы того или нет, будет вызван конструктор без параметров (если он у вас не описан, что скорее всего так и есть). Хотите ли вы того или нет у вас будет вызван деструктор так или иначе, поскольку конструктор этого класса вызван. Поэтому "интерфейс" в плюсах состоит из набора чисто виртуальных методов и виртуального пустого деструктора.
Carbon вне форума Ответить с цитированием
Старый 15.06.2010, 05:31   #5
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Carbon
Благодарю за ответ. Кстати вы можете объяснить: почему деструктор базового класса имеющего виртуальные методы автоматически не становится виртуальным? Ведь похоже его в этом случае по любому приходится вручную делать виртуальным...

Последний раз редактировалось Oleg_SK; 15.06.2010 в 05:34.
Oleg_SK вне форума Ответить с цитированием
Старый 15.06.2010, 05:50   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Oleg_SK Посмотреть сообщение
Carbon
Благодарю за ответ. Кстати вы можете объяснить: почему деструктор базового класса имеющего виртуальные методы автоматически не становится виртуальным? Ведь похоже его в этом случае по любому приходится вручную делать виртуальным...
Дык в плюсах так всегда: метод не будет виртуальным, пока его таковым не сделать. А это вопрос больше не ко мне, а к разработчикам стандарта.
Carbon вне форума Ответить с цитированием
Старый 15.06.2010, 06:09   #7
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Вы можете на вскидку привести пример, когда в указанном случае (базовый класс имеет виртуальные методы) деструктор базового класса не нужно (не имеет смысла или даже вредно) делать виртуальным?
Oleg_SK вне форума Ответить с цитированием
Старый 15.06.2010, 06:14   #8
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Ну либо у класса нет потомков, либо деструктор скрыт.
Carbon вне форума Ответить с цитированием
Старый 15.06.2010, 06:19   #9
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

И еще появился вопрос (возможно, - глупый) относительно виртуальности (просто ради интереса): расспространяется ли она только в сторону классов-наследников или еще и в сторону классов-предков относительно того класса, в котором метод впервые был объявлен виртуальным?
Oleg_SK вне форума Ответить с цитированием
Старый 15.06.2010, 06:24   #10
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Только на наследников.
Carbon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] Указатель на производный класс в базовом Student_IT Общие вопросы C/C++ 3 06.06.2010 07:06
Как в базовом классе описать указатель на объект производного класса? MasterGH Общие вопросы C/C++ 3 16.11.2009 02:55
Классы(абстрактный и наследование) Пепел Феникса Общие вопросы C/C++ 6 02.11.2009 01:18
Наследование: абстрактный класс zak Общие вопросы C/C++ 4 22.12.2007 13:49