Вопрос по abstract-class, virtual-inheritance, inheritance, c++ – C ++ абстрактные конструкторы / деструкторы базового класса - общая корректность

13

Недавно я стал тупым разработчиком, поэтому я сделал решающий шаг, получил книгу по С ++ и научился правильно делать вещи. В моей голове я знаю, что я хотел бы сделать. Я действительно хочуInterface что при наследовании должен быть переопределен (если это возможно?). Пока у меня есть следующее:

class ICommand{

public:
    //  Virtual constructor. Needs to take a name as parameter
    //virtual ICommand(char*) =0;
    //  Virtual destructor, prevents memory leaks by forcing clean up on derived classes?
    //virtual ~ICommand() =0; 
    virtual void CallMe() =0;
    virtual void CallMe2() =0;
};

class MyCommand : public ICommand
{
public:
    // Is this correct?
    MyCommand(char* Name) { /* do stuff */ }
    virtual void CallMe() {}
    virtual void CallMe2() {}
};

Я намеренно оставил, как я думаю, конструктор / деструктор должен быть реализован вICommand, Я знаю, если я удалю комментарии, это не скомпилирует. Пожалуйста, может кто-то:

Покажите мне, как объявить конструктор / деструктор вICommand и как они предназначены для использования вMyCommandПравильно ли я настроил вещи вICommand так чтоMyCommand должен переопределитьCallMe а такжеCallMe2.

Я надеюсь, что я не пропустил что-то действительно простое ...

В основном вы должны использоватьstd::string и деструктор будет{}, Также узнайте о списке инициализатора конструктора и подумайте, не стоит ли братьconst char*. UncleBens

Ваш Ответ

1   ответ
22

иртуального конструктора) будет выглядеть примерно так:

class ICommand {
public:
    virtual ~ICommand() = 0;
    virtual void callMe() = 0;
    virtual void callMe2() = 0;
};

ICommand::~ICommand() { } // all destructors must exist

Обратите внимание, что даже чистый виртуальный деструктордолжен быть определенным.

Конкретная реализация будет выглядеть точно так же, как ваш пример:

class MyCommand : public ICommand {
public:
    virtual void callMe() { }
    virtual void callMe2() { }
};

У вас есть парапараметры для конструктора. Один из вариантов - отключить конструктор по умолчанию дляICommandтак что подклассы будутимеют реализовать конструктор, который вызывает ваш конструктор ICommand:

#include <string>

class ICommand {
private:
    const std::string name;
    ICommand();
public:
    ICommand(const std::string& name) : name(name) { }
    virtual ~ICommand() = 0;
    virtual void callMe() = 0;
    virtual void callMe2() = 0;
};

ICommand::~ICommand() { } // all destructors must exist

Конкретная реализация теперь будет выглядеть примерно так:

class MyCommand : public ICommand {
public:
    MyCommand(const std::string& name) : ICommand(name) { }
    virtual void callMe() { }
    virtual void callMe2() { }
};
Я использую определение ОП виртуального конструктора, который является болеетребуемая функция, аналогично обычным чисто виртуальным функциям-членам. В этом случае то, что заставляет подклассы использовать конструктор, который включает параметр «name». Я согласен, что «виртуальный конструктор» технически не имеет смысла. e.James
@PaulManta Delphi имеет виртуальные конструкторы, которые действуют больше как фабрика, но тип создаваемого объекта определяется во время выполнения (IIRC) Filip Roséen - refp
@StuartGolodetz Обратите внимание, что я исключил функции, подобные конструкторам, в своем исходном комментарии. Paul Manta
«C ++ не допускает виртуальных конструкторов» Я не уверен, что это правильная формулировка. Что бы значил виртуальный конструктор, если бы какой-то язык его реализовывал? (Обратите внимание, что я имею в виду фактические конструкторы, а не функции, подобные конструкторам, и имею в виду только статические языки.) Paul Manta
@ Пол: Вы можете найти это интересным:parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8 Stuart Golodetz

Похожие вопросы