C++ 基类引用用不同的派生类对象初始化

标签 c++ reference constructor

class Base
{
public:
    void operator()() { func(); }
private:
    virtual void func() {}
};

class Derived1 : public Base
{
private:
    void func() override {/*do something*/}
};

class Derived2 : public Base
{
private:
    void func() override {/*do something else*/}
};

因为我想使用运算符重载,
引用是比指针更好的选择。

我打算做的是:

if (condition) {
    Base& obj = Derived1();
} else {
    Base& obj = Derived2();
}

但是 obj 将被销毁并结束作用域。

Base& obj;
if (condition) {
    obj = Derived1();
} else {
    obj = Derived2();
}

也不行,
因为需要在声明时初始化引用。

如果我尝试:

Base& obj = condition ?
    Derived1() : Derived2();

还是报错, 因为三元运算符需要可转换类型。

处理这个问题的最佳解决方案是什么?

最佳答案

在这种情况下不能使用 ?:,因为 Derived1 和 Derived2 是不同的类型

一种可能的方法是使用指针,这是有效的:

condition ? pObj.reset(new Derived1()) : pObj.reset(new Derived2());

或者

#include <memory>
std::unique_ptr<Base> pObj;
if (condition)
{
    pObj.reset(new Derived1());
}
else
{
    pObj.reset(new Derived2());
}

你可以这样调用operator():

(*pObj)();  

关于C++ 基类引用用不同的派生类对象初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18252412/

相关文章:

c# - 在没有引用的情况下构造对象?

java - 基于 SCJP 程序的怀疑(EXAM 310-065)

c++ - 为什么我在传递 vl 或 vl1 时得到与输出相同的值 (0x7fff5fbff808)?地址应该不同

c++ - Floyd Steinberg 抖动灰色(pgm ascii)到黑白(pbm ascii)

c++ - const A aref = 3 等于 int & const aref = 3 OR int & aref = 3

javascript - 定义对要以 JSON 格式存储的元素的引用,而不使用元素的类或 id

c++ - 有没有办法告诉 C++11 使用 std::string 而不是 const char*?

c++ - C++数组传递给具有大小的函数

java - 为什么还可以使用空白构造函数?

java - 我们可以在构造函数上使用 wait() 方法吗? java