我正在经历一个奇怪的对象切片案例。我在需要单例类的项目上工作,所以我的Base和派生类都是单例。以下示例案例描述了我的情况。
这是我的基础课
// 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();
任何澄清将不胜感激。谢谢你。
当你做
Base::base=Derived::derived;
您没有将基本引用设置为引用派生类。这是赋值运算符和所有它的作用是将ASIGNBase
的一部分derived
来base
。
base
仍然是类型Base
,并且永远无法更改,因为引用只能被初始化一次,而您可以使用
Base& Base::base=Base::getBaseInstance();
如果您希望这种重新分配行为,则需要使用指针类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句