|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.06.2010, 23:15 | #1 |
Пользователь
Регистрация: 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. |
15.06.2010, 02:13 | #2 |
JAVA BEAN
Участник клуба
Регистрация: 22.04.2007
Сообщений: 1,329
|
А зачем???
Деструктор базового класса так или иначе будет вызван. |
15.06.2010, 05:06 | #3 |
Пользователь
Регистрация: 06.06.2010
Сообщений: 42
|
Carbon
Собственно базовый класс у меня служит в качестве интерфейса, т.е. содержит только абстрактные виртуальные методы и соответственно деструктор в нем не нужен, по этому я хотел его тоже сделать абстрактным... Как я понял, этого сделать нельзя, верно? |
15.06.2010, 05:17 | #4 |
JAVA BEAN
Участник клуба
Регистрация: 22.04.2007
Сообщений: 1,329
|
В плюсах нету интерфейсов, как в некоторых других языках. Тут их роль играют обычные классы, в которых есть только чисто виртуальные функции. Но в отличие от нормальных интерфейсов это настоящий класс, поэтому хотите ли вы того или нет, будет вызван конструктор без параметров (если он у вас не описан, что скорее всего так и есть). Хотите ли вы того или нет у вас будет вызван деструктор так или иначе, поскольку конструктор этого класса вызван. Поэтому "интерфейс" в плюсах состоит из набора чисто виртуальных методов и виртуального пустого деструктора.
|
15.06.2010, 05:31 | #5 |
Пользователь
Регистрация: 06.06.2010
Сообщений: 42
|
Carbon
Благодарю за ответ. Кстати вы можете объяснить: почему деструктор базового класса имеющего виртуальные методы автоматически не становится виртуальным? Ведь похоже его в этом случае по любому приходится вручную делать виртуальным... Последний раз редактировалось Oleg_SK; 15.06.2010 в 05:34. |
15.06.2010, 05:50 | #6 |
JAVA BEAN
Участник клуба
Регистрация: 22.04.2007
Сообщений: 1,329
|
Дык в плюсах так всегда: метод не будет виртуальным, пока его таковым не сделать. А это вопрос больше не ко мне, а к разработчикам стандарта.
|
15.06.2010, 06:09 | #7 |
Пользователь
Регистрация: 06.06.2010
Сообщений: 42
|
Вы можете на вскидку привести пример, когда в указанном случае (базовый класс имеет виртуальные методы) деструктор базового класса не нужно (не имеет смысла или даже вредно) делать виртуальным?
|
15.06.2010, 06:14 | #8 |
JAVA BEAN
Участник клуба
Регистрация: 22.04.2007
Сообщений: 1,329
|
Ну либо у класса нет потомков, либо деструктор скрыт.
|
15.06.2010, 06:19 | #9 |
Пользователь
Регистрация: 06.06.2010
Сообщений: 42
|
И еще появился вопрос (возможно, - глупый) относительно виртуальности (просто ради интереса): расспространяется ли она только в сторону классов-наследников или еще и в сторону классов-предков относительно того класса, в котором метод впервые был объявлен виртуальным?
|
15.06.2010, 06:24 | #10 |
JAVA BEAN
Участник клуба
Регистрация: 22.04.2007
Сообщений: 1,329
|
Только на наследников.
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[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 |