ClassAとClassBの2つのクラスがあるとします。
ClassBはClassAを継承し、いくつかの追加の関数と変数があります。
ClassAまたはClassBのいずれかを同じ引数として受け入れることができる関数を作成し、どちらが使用されたかを判別させることはできますか?
ClassAとClassBの2つのクラスがあるとします。
ClassBはClassAを継承し、いくつかの追加の関数と変数があります。
ClassAまたはClassBのいずれかを同じ引数として受け入れることができる関数を作成し、どちらが使用されたかを判別させることはできますか?
はい、参照によりパラメータを取得できます。
void foo(ClassA& x) //or const ClassA
ClassA
またはの両方のインスタンスを渡すことができ、ClassB
RTTIを使用して、実際に関数内にあるタイプを判別できます。
または、へのポインタを渡すこともできますがClassA
、可能な場合は参照が優先されます。
関数パラメーターをClassA
インスタンスへのポインターまたは参照として宣言します(値で渡さないでください。渡さないと、入力インスタンスは実行時にスライスされます)。次に、特定の機能dynamic_cast
にアクセスする必要がある場合に使用できます。ClassB
例えば:
class ClassA
{
public:
int a;
virtual ~ClassA() {}
void DoSomething();
};
class ClassB : public ClassA
{
public:
int b;
void DoSomethingElse();
};
void func(ClassA *obj)
{
int a = obj->a;
obj->DoSomething();
ClassB *objB = dynamic_cast<ClassB*>(obj);
if (objB)
{
int b = objB->b;
objB->DoSomethingElse();
}
}
int main()
{
ClassA a;
func(&a);
ClassB b;
func(&b);
return 0;
}
これは、少し間接的なアイデアです。この関数は、typeとtypeConsumer::accept
の両方のオブジェクトを受け入れ、特定の動作は、コンシューマーではなく、これらのクラスによって実装されます。A
B
struct Consumer;
struct A
{
virtual ~A() { }
virtual int use(Consumer &);
};
struct B : A
{
virtual int use(Consumer &);
};
struct Consumer
{
void accept(A & x)
{
int n = x.use(*this);
do_more_stuff(n);
}
void do_more_stuff(int);
// ...
};