Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопрос по наследству.


Автор: ShurikA 10.3.2006, 20:22
Если класс B наследует от А.
правильно ли:
Код

A* ptr = new B();

Автор: LPBOY 10.3.2006, 21:22
Да.

Автор: Daevaorn 10.3.2006, 21:23
ShurikA, Если у класса A есть виртуальный деструктор, то с точки зарения языка да - правильно.

Автор: maxim1000 10.3.2006, 21:48
как раз с точки зрения языка эта конструкция правильна всегда
а виртуальный деструктор нужен для того, чтобы при уничтожении вызвать деструктор B, а не A

Автор: MAKCim 10.3.2006, 23:29
Цитата

как раз с точки зрения языка эта конструкция правильна всегда

правильно если
Код

class A {...};
class B: public A {...};

с точки зрения языка она все же правильна, но возможность использования только в случае выше

Автор: BreakPointMAN 10.3.2006, 23:46
Цитата

Вопрос по наследству.

Здесь программистский форум, а не форум юридических консультаций! В языке C++ нет термина "наследство", но есть термин "наследование".

Автор: chipset 11.3.2006, 02:34
Цитата(Daevaorn @ 10.3.2006, 11:23 Найти цитируемый пост)
ShurikA, Если у класса A есть виртуальный деструктор, то с точки зарения языка да - правильно.

И если нету тоже. Виртуальный деструктор в реальной жизни можно и не делать, так-же как вполне можно не следовать принципам ООП там где это не требуеться. А то на RSDN некоторые уже собирались весь интерфейс std::vector переписывать. И это только потому-что, ах! (слабонервных попрошу выйти из зала) там нету виртуального деструктора smile smile
Добавлено @ 02:36
Цитата(BreakPointMAN @ 10.3.2006, 13:46 Найти цитируемый пост)
Здесь программистский форум, а не форум юридических консультаций! В языке C++ нет термина "наследство", но есть термин "наследование".

В принципе, в C++ вообще нету русских терминов так что я с тобой не соглашусь smile

Автор: BreakPointMAN 11.3.2006, 02:58
Цитата(chipset @ 11.3.2006, 02:34 Найти цитируемый пост)
В принципе, в C++ вообще нету русских терминов так что я с тобой не соглашусь smile

ну, я ни в одном переводном издании классических книг по C++ и книг по средам программирования на C++ не встречал термина "наследство"... smile Да и в работах русскоязычных авторов такого мне не попадалось. Ни в Страуструпе, ни в Подбельском, ни в Арханельском, ни в Круглински, ни в Александреску... да и вообще, если разобраться, термин относится не к языку, а к философии ООП.

Автор: maxim1000 11.3.2006, 03:15
Цитата(chipset @ 11.3.2006, 01:34 Найти цитируемый пост)
И если нету тоже. Виртуальный деструктор в реальной жизни можно и не делать, так-же как вполне можно не следовать принципам ООП там где это не требуеться. А то на RSDN некоторые уже собирались весь интерфейс std::vector переписывать. И это только потому-что, ах! (слабонервных попрошу выйти из зала) там нету виртуального деструктора

ну если для наследования, так проще было бы написать обертку с виртуальным деструктором (например, через private наследование или агрегацию, в конце концов)

если же предполагается, что от класса наследовать никто не будет, виртуальный деструктор - просто лишняя помеха для оптимизации...

Автор: chipset 11.3.2006, 03:26
Цитата(BreakPointMAN @ 10.3.2006, 16:58 Найти цитируемый пост)
Да и в работах русскоязычных авторов такого мне не попадалось. Ни в Страуструпе, ни в Подбельском, ни в Арханельском, ни в Круглински, ни в Александреску... да и вообще, если разобраться, термин относится не к языку, а к философии ООП.

Ладно, замнём оффтопик а то модераторы ещё поналетят smile
Цитата(maxim1000 @ 10.3.2006, 17:15 Найти цитируемый пост)
ну если для наследования, так проще было бы написать обертку с виртуальным деструктором (например, через private наследование или агрегацию, в конце концов)

Вот-вот. Именно обертку. Когда надо было всего-то, добавить какую-то несчастную push_back'y smile

Автор: DeadSoul 11.3.2006, 12:23
Цитата(chipset @ 11.3.2006, 02:34 Найти цитируемый пост)
Виртуальный деструктор в реальной жизни можно и не делать


chipset, в ситуации описанной в первом посте виртуальный деструктор обязателен

Автор: LPBOY 11.3.2006, 12:58
Цитата(DeadSoul @ 11.3.2006, 12:23 Найти цитируемый пост)
в ситуации описанной в первом посте виртуальный деструктор обязателен


Если он перед удалением не кастит обратно. smile
Код

delete (B*)ptr;

Автор: DeadSoul 11.3.2006, 13:14
LPBOY, извини, но это идиотизм.

Автор: LPBOY 11.3.2006, 14:26
Это не идиотизм, это была шутка юмора. smile

Автор: ShurikA 11.3.2006, 16:17
Мдя... за что люблю форуму программистов, это если спросишь маленький простой вопрос получишь множество ответов, и на самом деле не все на тему. smile

Я уточню вопрос:

есть класс A:
Код

class A {...};

только с виртуаьными функциями.

классы B и C:
Код

class B : public A {};
class C : public A {};

каждый из них в свою очередь перегрыжают все функции от А.

пользование:
Код

A* ptr[2];
ptr[0] = new B();
prt[1] = new C();
...
prt[0]->SomeFunction();
prt[1]->SomeFunction();


Правильно ли?

Автор: Stargazer 11.3.2006, 17:49
Абсолютно правильно.

Автор: ShurikA 11.3.2006, 20:03
Stargazer,
Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)