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

gne*_*iak 7 c++ constructor reference

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*/}
};
Run Code Online (Sandbox Code Playgroud)

因为我想使用运算符重载,所以
Reference是比指针更好的选择.

我打算做的是:

if (condition) {
    Base& obj = Derived1();
} else {
    Base& obj = Derived2();
}
Run Code Online (Sandbox Code Playgroud)

但是obj将被销毁并且范围结束.

Base& obj;
if (condition) {
    obj = Derived1();
} else {
    obj = Derived2();
}
Run Code Online (Sandbox Code Playgroud)

也不会工作,
因为引用需要在声明时初始化.

如果我尝试:

Base& obj = condition ?
    Derived1() : Derived2();
Run Code Online (Sandbox Code Playgroud)

还是一个错误,因为三元运算符期望可转换类型.

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

bil*_*llz 5

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

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

condition ? pObj.reset(new Derived1()) : pObj.reset(new Derived2());
Run Code Online (Sandbox Code Playgroud)

要么

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

你可以这样打电话operator():

(*pObj)();  
Run Code Online (Sandbox Code Playgroud)