我遇到了对象切片的奇怪情况。我正在处理需要单例类的项目,所以我的基类和派生类都是单例类。以下示例案例描述了我的情况。对基类静态引用数据成员的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晚以来的编码,我想我应该睡觉)再次感谢。 –