私は以下のような定義された純粋仮想クラスがあります。私のような定義のコンストラクタを追加していない場合は純粋に仮想/抽象クラスは、特に保護されたconstメンバ変数にコンストラクタを必要とするのはなぜですか?
class BaseClass {
protected:
const int var;
public:
void somefun() = 0; // what I mean by a purely virtual class
// stuff...
};
を:
BaseClass(const int & VAR) : var(VAR) {};
私はその後、これまで派生クラスで使用しなければならないでしょう、私の派生クラスはconst変数varをどの値にでも初期化できません。今私は実際にここで何が起こっているのか理解しています。派生クラスを構築する前に、基本クラスのコンストラクタが呼び出され、その時点でconstメンバ変数を初期化する必要があります。私の質問は、「私のコード作業をどうすればいいのか」という質問ではなく、すでに完了している。私の質問は、コンパイラがそれが必要だと思う理由についてです。コンパイラは以降(BaseClassのコンストラクタへの呼び出しは、必ずしもいくつかの派生クラスconstructrorへの呼び出しが続くことを知っている場合
class DerivedClass : BaseClass {
public:
DerivedClass() : var(SOME_VALUE) {};
}
:純粋仮想クラスのために、私はのような何かを書くことは許されるべきではありません抽象型のオブジェクトをインスタンス化することはできません)余裕をもう少し与えてはいけませんか?
これは、C++がダイヤモンドの問題を回避する方法の結果ですか?たとえそうであったとしても、コンパイラは、純粋に仮想関数のconstメンバー変数が派生クラスで定義される可能性を少なくとも何らかの形で許してはいけませんか?それはあまりにも複雑か、それともC++のDiamond問題の解決法が混乱していますか?
皆さんありがとうございます。
おそらく、コンパイラは、派生クラスが基本クラスの保護されたメンバを初期化しなければならないというルールを強制しなければならない可能性があります。 –
私はそれがそうするのは事実だと思います。しかし、この状況で本当に必要なのでしょうか? – ticster