-4

重複の可能性:
C++ では、仮想基底クラスとは何ですか?
仮想継承

仮想基本クラスのコンストラクターがほとんどの派生クラスから呼び出されるのはなぜですか...そして継承階層では、最初に仮想基本クラスへのオブジェクトが作成されます...これの背後にあるロジックは何ですか?

仮想継承を使用してダイヤモンド構造のように仮想継承を使用すると、最も基本的なクラスのコピーが1つだけ作成されることを理解していますが、線形継承で仮想が正確に何をしているのか。

class A{};
class B : virtual public A {};  
class C : virtual public B {};

この種の継承を使用して、実際に何を達成しようとしているのでしょうか?

また、仮想継承の場合のオブジェクト レイアウトは何ですか?

誰かが C++ でのこの種の動作の背後にあるロジックを説明できますか?

4

1 に答える 1

2

仮想継承は間違いなくデフォルトであるはずです。私が次のようなものを書いた場合:

class Base
{
public:
    virtual ~Base() {}
    virtual void f() = 0;
    virtual int g() const = 0;
    //  ...
};

、このクラスがから継承されることを意図していることは明らかです。後で書く場合:

class Middle : public virtual Base
{
public:
    virtual void f();  
};

、クラスは依然として基本クラスであることを明確に意図しており、インターフェイスの一部のみを実装しています。この場合、 の実装がさらに派生クラスにあるのか、姉妹クラスにあるのか(ミックスインテクノロジー)がわからない(または1つのソリューションだけを課したくない)ため、継承g()仮想である必要があります。 。したがって、

class Derived1 : public Middle
{
public:
    virtual int g() const;
};

直径はありませんが、作者はMiddleこれが当てはまるとは知らず、禁止したくありませんでした。

class M2 : public virtual Base
{
public:
    virtual int g() const;
};

class Derived2 : public Middle, public M2
{
};

そして、そのような階層が与えられた場合、誰がのコンストラクターを呼び出す必要があります。Base唯一の合理的な候補はDerived2です。

于 2012-05-10T14:38:17.480 に答える