将函数参数转换为子类c ++

时间:2012-10-31 22:32:59

标签: c++ parameters implicit-conversion

我有一个非虚拟接口(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();
}

工作正常。 是否可以通过类型的隐式转换来执行此操作?

1 个答案:

答案 0 :(得分:0)

基本上你想隐式创建一个用x构造的子对象,然后将它传递给myFunction( Parent& )

您可以执行myFunction(Child(x));

但我认为当您尝试使用裸x时,它会尝试构造一个对象:Parent(x)并且它失败了。这不是你想要的,因为你想要一个Child对象的实例。

make_pair执行类似操作的方式是在正在创建的对象(对)上使用模板化复制构造函数,该对象创建所需类型的对象。

我认为你想要做的事情不能以这种方式完成,因为你想要创建派生类,并且不会尝试这样做,因为函数签名是Parent&

编辑和替代解决方案 我做了一些尝试,通过向Parent类添加一个模板化的构造函数来创建一个基于模板的解决方案,但它确实归结为最终你需要调用派生类的构造函数。

我认为允许使用myFunction(Parent&)的唯一合理解决方案是使用间接方法,在构建(临时?)孩子后返回对父级的引用 - 这当然意味着你会有如果你有很多子类,很多这样的方法。我意识到这并不像传入int那样简单(并且让它构造并传入ref),但它几乎是你想要的:)