4
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

4 に答える 4

8

いいえ、実際には、基本クラスが明示的に定義されたコンストラクターを持つ必要はありません (ただし、仮想デストラクタがあることを確認してください)。

したがって、典型的なインターフェースの場合、次のようなものにすることができます。

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
于 2008-11-06T22:34:05.277 に答える
4

パラメーターがない限り、基本クラスのコンストラクターを明示的に呼び出す必要はありません。コンパイラはコンストラクタを自動的に呼び出します。理論的には、基本クラスにはまだコンストラクターがありますが、何もしない場合、コンパイラーはそれを最適化して存在しないようにする可能性があります。

于 2008-11-06T22:54:02.227 に答える
2

いいえ、あなたが提供した例ではありません。基本クラスの既定のコンストラクターは、派生クラスのメンバーが初期化される前に、基本クラスが宣言されたのと同じ順序で自動的に呼び出されます。

于 2008-11-06T22:36:24.040 に答える
0

基本クラスのコンストラクターがパラメーターを必要としない場合は、既定のコンストラクターとして呼び出されるため、派生クラスで呼び出す必要はありません。ただし、基本クラスが空であっても、仮想デストラクタを提供する必要があります。それ以外の場合、コンパイラはデフォルトで非仮想であるデフォルトのデストラクタを生成します。

于 2012-12-27T14:19:46.490 に答える