【发布时间】:2016-07-22 15:58:41
【问题描述】:
我正在经历一个奇怪的对象切片案例。我正在做一个需要单例类的项目,所以我的基类和派生类都是单例的。以下示例案例描述了我的情况。
这是我的基类
// 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 晚开始编码,我想我应该只是睡觉)再次感谢。
标签: c++ singleton static-members object-slicing