基类静态引用数据成员上C ++对象切片行为的奇怪案例

Xperience博士

我正在经历一个奇怪的对象切片案例。我在需要单例类的项目上工作,所以我的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();

任何澄清将不胜感激。谢谢你。

内森·奥利弗(NathanOliver)

当你做

Base::base=Derived::derived;

您没有将基本引用设置为引用派生类。这是赋值运算符和所有它的作用是将ASIGNBase的一部分derivedbase

base仍然是类型Base,并且永远无法更改,因为引用只能被初始化一次,而您可以使用

Base& Base::base=Base::getBaseInstance();

如果您希望这种重新分配行为,则需要使用指针类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

避免对象切片C ++

来自分类Dev

如何结合布尔掩码和切片对象来切片数据帧?

来自分类Dev

通过引用传递可避免对象切片

来自分类Dev

访问对象数据切片numpy数组

来自分类Dev

在数据框中切片对象类型的值

来自分类Dev

熊猫如何使用Series对象切片数据框?

来自分类Dev

C ++防止std :: vector中的对象切片

来自分类Dev

C#中的虚拟方法和对象切片

来自分类Dev

切片数据框

来自分类Dev

C ++矩阵模板类切片

来自分类Dev

当派生对象声明没有新成员时,是否发生多态切片

来自分类Dev

通过基础引用分配对象切片是否定义明确?

来自分类Dev

切片列表时,Python是否复制对对象的引用?

来自分类Dev

在boost :: ptr_vector上的std :: reverse会切片对象?

来自分类Dev

如何通过引用返回切片?

来自分类Dev

在3D数组上同时使用切片索引和布尔索引时的结果很奇怪

来自分类Dev

当我们引用非静态数据成员时,细分错误实际上是未定义的行为吗

来自分类Dev

在C ++中二维数组中的对象切片

来自分类Dev

如何将特征对象切片传递给C

来自分类Dev

C ++中二维数组中的对象切片

来自分类Dev

切片上的图案匹配

来自分类Dev

切片上的图案匹配

来自分类Dev

重塑数据框切片列

来自分类Dev

条件数据框切片

来自分类Dev

R数据帧切片

来自分类Dev

在SQL Server中切片数据

来自分类Dev

熊猫数据框切片

来自分类Dev

Python数据帧错误切片

来自分类Dev

C中的数组切片