0

ClassAとClassBの2つのクラスがあるとします。

ClassBはClassAを継承し、いくつかの追加の関数と変数があります。

ClassAまたはClassBのいずれかを同じ引数として受け入れることができる関数を作成し、どちらが使用されたかを判別させることはできますか?

4

3 に答える 3

2

はい、参照によりパラメータを取得できます。

void foo(ClassA& x) //or const ClassA

ClassAまたはの両方のインスタンスを渡すことができ、ClassBRTTIを使用して、実際に関数内にあるタイプを判別できます。

または、へのポインタを渡すこともできますがClassA、可能な場合は参照が優先されます。

于 2012-10-31T23:02:39.060 に答える
2

関数パラメーターを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;
}
于 2012-10-31T23:07:06.130 に答える
0

これは、少し間接的なアイデアです。この関数は、typeとtypeConsumer::acceptの両方のオブジェクトを受け入れ、特定の動作は、コンシューマーではなく、これらのクラスによって実装されます。AB

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

    // ...
};
于 2012-10-31T23:23:23.527 に答える