Object slicingの奇妙なケースがあります。私は私のベースと派生クラスの両方がシングルトンなので、シングルトンクラスが必要なプロジェクトに取り組んでいます。以下のサンプルケースは私の状況を説明しています。C++の奇妙なケースBase class静的参照データメンバのオブジェクトのスライシング動作
は、これが私の基本クラスです
// Base.h
class Base
{
public:
static Base& base;
virtual void doSomething(){ cout<<"Base Do Something"<<endl; }
protected:
Base();
virtual ~Base();
static Base& getBaseInstance();
private:
};
//Base.cpp
Base::Base()
{
//ctor
}
Base::~Base()
{
//dtor
}
Base& Base::getBaseInstance()
{
static Base object;
return object;
}
Base& Base::base=Base::getBaseInstance();
これは私の派生クラス
class Derived: public Base
{
public:
static Derived& derived;
virtual void doSomething(){ cout<<"Derive Do Something"<<endl; }
static Derived& getDerivedInstance();
protected:
Derived();
virtual ~Derived();
private:
};
Derived::Derived()
{
//ctor
}
Derived::~Derived()
{
//dtor
}
Derived& Derived::derived=Derived::getDerivedInstance();
Derived& Derived::getDerivedInstance()
{
static Derived object;
return object;
}
され、最終的にこれが私の主な機能
int main()
{
cout << "Hello world!" << endl;
Base::base.doSomething();
Derived::derived.doSomething();
Base::base=Derived::derived;
Base::base.doSomething();
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
Base& r = Derived::derived;
r.doSomething();
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
return 0;
}
であり、私はこのために、次の出力を取得しています
Hello world!
Base Do Something
Derive Do Something
Base Do Something
Base Do Something
Derive Do Something
Base Do Something
私の質問はオブジェクトのスライスが参照上で機能しないはずだから、なぜ私は上書きすることができないのですか?Base::base
参照派生オブジェクトの基本クラスの静的データメンバーとして作成しましたか?これはうまくいくのですがBase& r = Derived::derived;
r.doSomething()
で何かを呼び出すと、私は派生クラスのdoSomethingを取得します。しかし、これは
Base::base=Derived::derived;
Base::base.doSomething();
または
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
となる明確化の任意の並べ替えではありません理解されるであろう。 ありがとうございます。
参照を辞退することはできません。あなたのように見えたら、何が起こっているのかスライシングです。 –
ありがとうございます。私はそのようなばかげたミスを犯した(コーディング2泊まっすぐ、私はちょうど眠るべきだと思う)もう一度ありがとう。 –