私たちが持っているとしましょう:
class Base {...}
class A : public Base {...}
class B : public Base {...}
ジェネリックメソッドの引数の型として設定することは可能ですか:
myMethod([typei'mlookingfor] c) {}
メソッドをオーバーロードせずに Base、A、および B を渡すことができるようにするにはmyMethod()
? また、参照とポインターで動作するようにしますか?
基本クラスへのポインターまたは参照が機能する場合は、それを使用してください。
void myMethod(Base& c) {}
A a;
B b;
myMethod(a); //OK
myMethod(b); //OK
オブジェクトのスライスを防ぐには、参照またはポインターを使用する必要があることに注意してください。メソッドが の場合、myMethod(Base c)
派生オブジェクトの型情報が失われます。
そうでない場合は、テンプレートを使用できます
template<typename T>
void myMethod(T& c)
{
}
A a;
B b;
myMethod(a);
myMethod(b);
Q: メソッド引数の型をクラスまたは派生クラスに定義することは可能ですか?
A: わかりました。なぜだめですか?
任意の型にできる「ジェネリック」パラメーターが必要な場合は、テンプレートを使用してください。
それ以外の場合、「クラスまたは任意のサブクラス」が必要な場合は、基本クラスを使用してください。
有用な引用:
http://wiki.answers.com/Q/What_are_the_concepts_of_object_directional_programming
ポリモーフィズムにより、プログラマは派生クラスのメンバーを親クラスのメンバーと同じように扱うことができます。より正確には、オブジェクト指向プログラミングにおけるポリモーフィズムとは、異なるデータ型に属するオブジェクトが、同じ名前のメソッドのメソッド呼び出しに応答する能力であり、それぞれが適切な型固有の動作に従っています。
これは、まさにあなたが探しているものだと思います:)
これを行う方法は 2 つあります。1つ目は動的ポリモーフィズムです。ポインターと参照でのみ機能します。わずかな実行時間のオーバーヘッドがあります。
void myMethod(Base& x) { ...}
2番目 - 静的ポリモーフィズム:
template<class T>
std::enable_if<is_base_of<Base,T>::value>
myMethod(base x) {...}