0

基本クラス「A」と、基本クラス「A」から派生した2つのクラス「B」と「C」があるとします。

私はこれができることを知っています

A *a = new B();
or
A *a = new C();
a->handle() //handle is a virtual function in A. class B and C overloaded this function and added its own implementation. 

次に、BオブジェクトまたはCオブジェクトのいずれかからhandle関数を呼び出します。

ただし、プログラムでポインタを使用できないという制限があります。Aを次のように定義する必要があります

A a //not A *a

次に、クラスBまたはCからハンドル関数を呼び出すようにこれを実装するにはどうすればよいですか?

4

3 に答える 3

3

できません。Aタイプの値を取得して、それが。のふりをすることはできませんB。それは悪いことであり、実行することはできません。

于 2012-06-12T00:16:13.870 に答える
1

奇妙な質問。できません。正気の手段ではありません。結局のところ、それは「A」です。

あなたが「私はCの美徳と呼びたい」を知っていると仮定すると、あなたは次のような邪魔なことをすることができます:

#include <stdio.h>

class A { public: virtual int foo() { return 1; } };
class B : public A{ public: virtual int foo() { return 2; } };
class C : public A{ public: virtual int foo() { return 3; } };

int main()
{
    A a;
    C *c = (C*)&a;
    int x = c->C::foo();  // EXAMPLE 1
    printf("x == %d\n", x);

    x = ((C&)a).C::foo(); // EXAMPLE 2

    printf("x == %d\n", x);
    return 0;
}

例2は、真ん中に何もないのとまったく同じであることに注意してください。読みにくいですが、同じ結果です。

重要なのはC::foo();を使用することです。C ::がない場合、仮想テーブルを調べて、結果は「1」になります。

于 2012-06-12T00:23:37.327 に答える
0

これが宿題の場合、おそらく教授は純粋なポインタ(*)の代わりに参照(&)を使用することを意図していました。

A &a = * new B();
or
A &a = * new C();
a.handle()

C ++での参照は、通常のポインターとほとんど同じですが。

于 2012-06-12T00:21:00.053 に答える