2016-04-22 34 views
0

いくつかのプロダクションコードで作業していますが、そのうちのいくつかは安全に変更できません。私の問題は、特定のメソッドを使用したいと思います。パラメータの1つはクラスへのポインタです。しかし、パラメータとしてのクラスは私が望むことをしません。継承:親ポインタから継承したメソッドを使用する

私はそのクラスのサブクラスを書き、上記の関数を呼び出そうとしていますが、それでも親クラスのメソッドを使用しています。

私は以下MWEがあります。これに出力を実行している上記の例では

#include <iostream> 

class Parent 
{ 
public: 
    Parent() {}; 
    void method() {std::cout<<"in Parent\n";} 
}; 

class Child : public Parent 
{ 
public: 
    Child() {}; 
    void method() {std::cout<<"in Child\n";} 
}; 

void secondMethod(Parent* Pptr) 
{ 
    Pptr->method(); 
} 

int main() 
{ 
    Child c = Child(); 
    Parent* parentPtr = &c; 

    c.method(); 
    parentPtr->method(); 

    secondMethod(parentPtr); 
    secondMethod(&c); 

    return 0; 
} 

はもちろんです:

in Child 
in Parent 
in Parent 
in Parent 

私は問題がスライスされたと考えていますか?基本的には、親クラスのポインタにキャストしているので、親クラスと見なされます。

親クラスでメソッドを仮想化することでこれを回避する方法がいくつか見受けられましたが、そのオプションはありません。

secondMethodを実際に使用する方法はありますか?特に、ParentクラスまたはsecondMethodを変更することなく

答えて

0

親クラスまたは 'secondMethod'を変更できない場合は実際にはありません。 'secondMethod'のコンストラクタは、そのパラメータをParent *として定義します。 Child *を 'secondMethod'に渡すと、Child *がParent *にアップキャストされ、Parentの 'method'の実装が呼び出されます。

0

methodを仮想関数に変更できない場合、テンプレートをインポートして問題を解決できます。 template<typename T> void secondMethod(T* Pptr) { Pptr->method(); } うまくいくかもしれません!