c++ - 将临时派生对象传递给需要基础对象引用的方法/函数

标签 c++ polymorphism

前言:我希望能够存储来自派生(具体)类类型的对象的(抽象)基类引用,以便稍后可以返回它并强制转换为相同的派生(具体)类,而无需求助于指针并且经常需要担心所有权、内存泄漏和悬空指针/错误引用。

使用下面的层次结构,尝试的构造函数调用:A(/* Other variables */, Bar(/* Bar variables */)); 失败并显示 `Warning 3 warning C4239: nonstandard extension使用:'argument':从'Bar'到'Foo&'的转换(Visual Studio 2010 SP1)

更改 class O 以包含 Foo* _foo 并将构造函数初始化为 /*...*/, _foo(&foo) 导致悬空指针,因为当构造函数完成时临时对象被销毁。

有没有办法将一个临时对象传递给一个需要引用的类,而不是让代码变得疯狂?

`

/* ABSTRACT BASE CLASS */
class Foo {
    //...
};

/* DERIVED, CONCRETE CLASS */
class Bar : public Foo {
    //...
};


class O {
    O(/* Other variables */, Foo& foo) : /* Other member variable initializations */, _foo(foo) { }

    //...Other member variables here...
    Foo& _foo;
    friend class A;
};

class A {
    public:
        A(/* Other individual variables used to fully construct object 'O' */, Foo& foo) : /*...*/, _foo(foo) { }
    private:
        O _o

};

最佳答案

Is there a way to pass a temporary object to a class that expects a reference and not have the code go bonkers?

没有。在处理引用时不必太担心所有权的原因是所有权在其他地方处理 - 特别是在拥有被引用变量的级别。

当被引用的对象超出范围时,引用就变得无效(是的,引用也可能是悬空的)。只要对它的引用处于事件状态,被引用的对象就必须保留。这就是为什么你不能让临时对象很好地与引用一起玩:临时对象很快就会超出范围,使对它们的引用变得无用。

关于c++ - 将临时派生对象传递给需要基础对象引用的方法/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13896162/

相关文章:

C++冒泡排序,如何忽略相同的数字

c++ - 多个条件变量互相调用函数

swift - 快速多态和动态类型的问题

c++ - 访问映射中元素的成员,其值为 C++ 中的抽象基类

c++ - 字段访问 - C++ 中的多态和非多态类型

python - 从图像中分割相似强度的对象

c++ - 错误 : assignment of data-member ‘RootBoxT<CORE::DoubleWrapper>::innerBox_’ in read-only structure

c++ - 有人在使用命名的 boolean 运算符吗?

c++ - 使用具有继承类的容器

c++ - vector map 的实现