我遇到了對象切片的奇怪情況。我正在處理需要單例類的項目,所以我的基類和派生類都是單例類。以下示例案例描述了我的情況。對基類靜態引用數據成員的C++對象切片行爲的奇怪情況
這是我的基類
// 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
引用我創建爲帶有Derived對象的基類的靜態數據成員?雖然這工作正常Base& r = Derived::derived;
我的意思是當我打電話做一些事情r.doSomething()
我得到doSomething派生類。但事實卻不是這樣與
Base::base=Derived::derived;
Base::base.doSomething();
或
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
任何類型的澄清將不勝感激。 謝謝。
您不能辭職。如果它看起來像你那麼正在發生的是切片。 –
謝謝隊友。我犯了這樣一個愚蠢的錯誤(自2晚以來的編碼,我想我應該睡覺)再次感謝。 –