1

純粋仮想関数について質問があります。それがどのように機能し、いつ純粋仮想関数を使用する必要があるかについては明確ではありません。これは私が理解していない例です:

file.h

class A
{
public :
            A();
            ~A();

            virtual void func1(void) = 0;
            virtual UINT32 func2(void) = 0;
            UINT32 initialize(void) = 0;
}


file.cpp

UINT32 A:initialize (void)
{
            func1();
            func2();
            return (result);
}

この例が実際に何をし、その結果がどうなるかを詳しく説明できる人はいますか? あなたの助けと知識に本当に感謝しています。どうもありがとうございました。

4

2 に答える 2

1

(注: の宣言はinitialize()virtual であってはならず、 の実装はおそらくinitialize()返されるはずfunc2()です。これは例であるため、実際には何をするかは問題ではありませんがinitialize()、正しくコンパイルする必要があります。)

仮想関数の主な目的は、ポリモーフィズムを実現することです。

クラスAは 2 つの純粋仮想メソッドを定義し、それらをinitialize呼び出します。これにより、プログラム内のコードはA、サブクラスを意識せずに何かの型を初期化できます。には多くのサブクラスが存在する場合がありA、それぞれが および 内で少し異なる動作をする場合がfunc1()ありfunc2()ます。のみを知っているコードは、Aを介して異なる型のオブジェクトを初期化することがあるため、多相型と呼ぶことができます。AA

class B : public A {
    void func1 () { std::cout << "B::func1" << std::endl; }
    UINT32 func2 () { return 1; }
};

class C : public A {
    void func1 () { std::cout << "C::func1" << std::endl; }
    UINT32 func2 () { return 2; }
};

void call_initialize (A *a) {
    std::cout << a->initialize()  << std::endl;
}

B b;
C c;
call_initialize(&b);
call_initialize(&c);

出力結果は次のとおりです。

B::func1
1
C::func1
2

が サブクラス化されたか によってAサブクラス化されたかによって出力が異なるため、これはポリモーフィック動作の例です。BC

于 2012-06-12T03:30:53.157 に答える
0

関数func1&func2は A に実装されていません (コードに示されているとおり)。
それらが実装されている場合は、呼び出されます。A の派生クラスがあり、派生クラスのオブジェクトがポリモーフィックに作成されている場合、つまり

class B : public A
{
 .....
};

A* obj = new B();

obj->initialize();

次に、B が実装した場合、B のバージョンの func1() と func2() が呼び出されます。

Ethan のコメントで述べたように、func2() から結果を取得していません。
したがって、次のいずれかを書く必要があります

UINT32 result = func2(); 

また

return func2();
于 2012-06-12T03:28:12.653 に答える