Если абстрактный базовый класс является интерфейсом, обязательно ли вызывать конструктор базового класса в конструкторе производного класса? - PullRequest
4 голосов
/ 07 ноября 2008
class AbstractQuery {
    virtual bool isCanBeExecuted()=0;
public:
    AbstractQuery() {}
    virtual bool Execute()=0;
};

class DropTableQuery: public AbstractQuery {
    vector< std::pair< string, string> > QueryContent;
    QueryValidate qv;
public:
    explicit DropTableQuery(const string& qr): AbstractQuery(), qv(qr) {}
    bool Execute();
};

Необходимо ли вызывать базовый конструктор в конструкторе производного класса?

Ответы [ 4 ]

8 голосов
/ 07 ноября 2008

Нет, фактически для базового класса нет необходимости иметь явно определенный конструктор (хотя убедитесь, что у вас есть виртуальный деструктор).

Так что для типичного интерфейса у вас может быть что-то вроде этого:

class MyInterface {
public:
    virtual ~MyInterface() {}
    virtual void execute() = 0;
};

РЕДАКТИРОВАТЬ: Вот причина, почему вы должны иметь виртуальный деструктор:

MyInterface* iface = GetMeSomeThingThatSupportsInterface();
delete iface; // this is undefined behaviour if MyInterface doesn't have a virtual destructor
4 голосов
/ 07 ноября 2008

никогда не обязательно явно вызывать конструктор базового класса, если у него нет параметров. Компилятор вызовет конструктор автоматически. Теоретически базовый класс все еще имеет конструктор, но компилятор может оптимизировать его до небытия, если он ничего не делает.

2 голосов
/ 07 ноября 2008

Нет, не в приведенном вами примере. Конструкторы по умолчанию базового класса будут вызываться автоматически в том же порядке, в котором объявлены базовые классы, до инициализации какого-либо члена производного класса.

0 голосов
/ 27 декабря 2012

Если конструктору базового класса не нужны никакие параметры, вам не нужно вызывать его в производном классе, поскольку он вызывается как конструктор по умолчанию. Однако вам нужно предоставить виртуальный деструктор для вашего базового класса, даже если он пуст. В противном случае компилятор сгенерирует деструктор по умолчанию, который по умолчанию не является виртуальным.

...