4

多重継承では、 classおよび classBaseによって継承される仮想クラスがあります。との基本クラスです。以下のコードを参照してください。andのコンストラクタでは、コンストラクタが呼び出されます。次の出力が得られることを期待しています。ABABABABBase(string)

Base::Base(std::string)

A::A()

B::B()

しかし、次の出力が得られます。

Base::Base()

A::A()

B::B()

のデフォルトコンストラクタBaseが呼び出されるのはなぜですか?

#include<iostream>
#include<string>
using namespace std;

class Base{
public:
        Base(){
                cout<<__PRETTY_FUNCTION__<<endl;
        }
        Base(string n):name(n){
                cout<<__PRETTY_FUNCTION__<<endl;
        }
private:
string name;
};

class A : public virtual Base {
public:
        A():Base("A"){
                cout<<__PRETTY_FUNCTION__<<endl;
        }
private:
string name;
};

class B : public virtual  Base {
public:
        B():Base("B"){
                cout<<__PRETTY_FUNCTION__<<endl;
        }
private:
string name;
};

class AB : public A, public B{

};

int main(){
        AB a;
}
4

1 に答える 1

5

仮想ベースは、最も派生したオブジェクトによって構築されます。SoABのコンストラクターはコンストラクターを呼び出しBaseますが、 のコンストラクターを指定しなかったためAB、その既定のコンストラクターは の既定のコンストラクターを呼び出すだけですBase

次のように文字列コンストラクターを呼び出すことができますAB

struct AB : A, B
{
    AB() : Base("hello"), A(), B() { }
};

このセットアップでは、コンストラクターA::A()とコンストラクターを呼び出さB:B()ないことに注意してください。Base

于 2013-06-24T10:48:18.640 に答える