Se a classe base abstrata é uma interface, é obrigatória a chamar o construtor da classe base no construtor da classe derivada?

StackOverflow https://stackoverflow.com/questions/270592

Pergunta

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();
};

É necessário chamar contructor de base no construtor da classe derivada?

Foi útil?

Solução

Não, na verdade, pois é desnecessária para a classe base para ter um construtor explicitamente definido (embora verifique se você tem um destrutor virtual).

Assim, para uma interface típica você poderia ter algo como isto:

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

EDIT: Aqui está uma razão pela qual você deve ter um destrutor virtual:

MyInterface* iface = GetMeSomeThingThatSupportsInterface();
delete iface; // this is undefined behaviour if MyInterface doesn't have a virtual destructor

Outras dicas

É não obrigatória para chamar explicitamente o construtor da classe base, a menos que tenha parâmetros. O compilador irá chamar o construtor automaticamente. Teoricamente a classe base ainda tem um construtor, mas o compilador pode otimizar-lo-á não-existência se não faz nada.

Não, não no exemplo que você forneceu. Os construtores classe base default será chamado automaticamente na mesma ordem que as classes base são declarados, antes de qualquer membro da classe derivada é inicializado.

Se o construtor da classe base não precisa de qualquer parâmetro, você não precisa de chamá-lo na classe derivada, uma vez que é chamado como um construtor padrão. No entanto, você precisa fornecer um destrutor virtual para sua classe base, mesmo se ela estiver vazia. Caso contrário, o compilador irá gerar um destruidor padrão que é não-virtual por padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top