簡體   English   中英

純虛函數,它如何工作

[英]pure virtual function, how it works

我有一個關於純虛函數的問題。 我不清楚它是如何工作的以及何時需要使用純虛函數。 這是我不理解的示例:

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

誰能詳細解釋該示例的實際作用和結果? 非常感謝您的幫助和知識。 非常感謝你。

(請注意, initialize()的聲明不應為虛擬的,並且initialize()的實現可能應返回func2() 。由於這是一個示例, initialize()並不重要,但應進行編譯正確地。)

虛函數的主要目的是實現多態。

A定義了兩個純虛方法,並initialize調用它們。 這允許程序中的代碼在不知道子類的情況下初始化A類型A A可能有許多子類,並且每個子類在func1()func2()所做的事情可能略有不同。 由於有時僅了解A的代碼有時會通過A初始化不同類型的對象,因此A可以稱為多態類型。

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

這是一個多態行為的示例,因為根據AB還是C子類化,輸出是不同的。

函數func1func2未在A中實現(根據所示代碼)。
如果實現了它們,則將它們調用。 如果存在A的派生類,並且派生類的對象是多態創建的,即

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

A* obj = new B();

obj->initialize();

然后,如果B實現了它們,則調用B版本的func1()和func2()。

如Ethan的評論中所述,您不是從func2()中獲取結果。
所以你需要寫

UINT32 result = func2(); 

要么

return func2();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM