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/