我有一个非虚拟接口(NVI)的父类:
class Parent {
private:
virtual int do_function(void) = 0;
public:
int function(void);
virtual ~Parent() {};
}
还有一个儿童班(实际上,我有很多子课,但我只希望这个以这种方式工作)
class Child : public Parent {
private:
int _x;
int do_function(void) { return _x; };
public:
Child(int x): Parent(), _x(x) {}
virtual ~Child() {return do_function();};
}
我想调用一个函数:
int myFunction(Parent& x) {
return x.function();
}
使用代码
int x = 5;
myFunction(x);
但不是
int myFunction(const Child& x) {
return x.function();
}
工作正常。 是否可以通过类型的隐式转换来执行此操作?
答案 0 :(得分:0)
基本上你想隐式创建一个用x构造的子对象,然后将它传递给myFunction( Parent& )
。
您可以执行myFunction(Child(x));
但我认为当您尝试使用裸x
时,它会尝试构造一个对象:Parent(x)
并且它失败了。这不是你想要的,因为你做想要一个Child对象的实例。
make_pair执行类似操作的方式是在正在创建的对象(对)上使用模板化复制构造函数,该对象创建所需类型的对象。
我认为你想要做的事情不能以这种方式完成,因为你想要创建派生类,并且不会尝试这样做,因为函数签名是Parent&
。
编辑和替代解决方案 我做了一些尝试,通过向Parent类添加一个模板化的构造函数来创建一个基于模板的解决方案,但它确实归结为最终你需要调用派生类的构造函数。
我认为允许使用myFunction(Parent&)
的唯一合理解决方案是使用间接方法,在构建(临时?)孩子后返回对父级的引用 - 这当然意味着你会有如果你有很多子类,很多这样的方法。我意识到这并不像传入int那样简单(并且让它构造并传入ref),但它几乎是你想要的:)