@sddvxd

Зачем в абстрактном базовом классе создавать конструктор?

Здравствуйте!
В литературе что я читаю автор в АБК создает конструктор:

class ABC{
public:
    ABC(tralala &, trololo);
    ....
};


Производный класс:

class Test : public ABC{
public:
    Test(trololo, tututu &):ABC(tututu &, trololo);
};


Вопрос: зачем создавать явный конструктор для АБК, если его объект создать нельзя (при наличии чистой виртуальной функции конечно) и вопрос второй: что за странный вызов конструктора АБК в конструкторе производного класса? Спасибо
  • Вопрос задан
  • 383 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Абстрактные классы делят на интерфейсы и частично реализованные. Грань между ними такова:
• Интерфейс не имеет данных.
• У интерфейса все неабстрактные виртуальные методы представляют собой или эталонное поведение, или самую частую реализацию. В обоих случаях, если что, их надо не расширять, а переписывать с нуля.

Так вот, для интерфейсов таких конструкторов, разумеется, не нужно.

Например, между абстрактным потоком и файлом Win32 может быть такая иерархия: Stream → HandleStream → File. Stream — интерфейс, даже если там есть что-то типа
// virtual
unsigned long long Stream::remainder() const { return size() - pos(); }


HandleStream содержит уже данные (дескриптор Win32), и это уже частично реализованный класс, который крутится вокруг этого дескриптора: в деструкторе вызов CloseHandle, конструктор может принимать дескриптор, полученный каким-то «левым» образом.
HandleStream::HandleStream(HANDLE aHandle) : fHandle(aHandle) {}
HandleStream::~HandleStream() { close(); }

void HandleStream::close()
{
  if (Handle != INVALID_HANDLE)  { // не помню, как там эта константа в Win32
    CloseHandle(fHandle);
    fHandle = INVALID_HANDLE;
  }
}

Вот в таких полуреализованных классах, разумеется, конструктор может инициализировать те данные, которые там есть.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы