2

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

效果很好。是否可以通过类型的隐式转换来做到这一点?

4

1 回答 1

0

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

你可以做myFunction(Child(x));

但我认为,当您尝试使用 bare 时x,它​​会尝试构造一个对象:Parent(x)但它失败了。无论如何,这不是您想要的,因为您确实想要一个 Child 对象的实例。

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

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

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

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

于 2012-10-31T23:08:21.833 回答