2

非仮想インターフェイス (NVI) を持つ親クラスがあります。

class Parent {
private:
    virtual int do_function(void) = 0;
public:
    int function(void);
    virtual ~Parent() {};
}

そして、子クラス(実は子クラスはたくさんあるのですが、このように動作させたいのはこの1つだけです)

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));

しかし、裸で試してみるとx、オブジェクトを構築しようとしてParent(x)失敗すると思います。Child オブジェクトのインスタンスが必要なため、それはあなたが望むものではありません

make_pair が同様のことを行う方法は、必要なタイプのオブジェクトを作成する作成中のオブジェクト (ペア) でテンプレート化されたコピー コンストラクターを使用することです。

派生クラスを作成したいので、やりたいことはそのようにはできないと思いますが、関数のシグネチャがParent&.

編集と代替ソリューション テンプレート化されたコンストラクターを親クラスに追加することにより、これに対するテンプレートベースのソリューションを作成するいくつかの試みを行いましたが、最終的に派生クラスのコンストラクターを呼び出す必要があるという事実に要約されます。

の使用を許可するこれに対する唯一の賢明な解決策は、myFunction(Parent&)(一時的な?) 子を構築した後に親への参照を返す間接メソッドを使用することだと思います-もちろん、多くの子がある場合、そのようなメソッドがたくさんあることを意味しますクラス。これは int を渡す (そしてそれを構築して ref に渡す) ほど単純ではないことを認識していますが、それはほとんどあなたが望むものです:)

于 2012-10-31T23:08:21.833 に答える