1. 程式人生 > >c++虛擬函式和抽象類

c++虛擬函式和抽象類

虛擬函式是c++實現多型的一種機制,基類的虛擬函式可以有子類的函式重新定義,從而實現函式功能的靈活性。

虛擬函式又分為:普通虛擬函式和純虛擬函式。

純虛擬函式是一種特殊的虛擬函式,它的一般格式如下:

    class <類名>
    {
        virtual <型別><函式名>(<引數表>)=0;
        …
    };

    在許多情況下,在基類中不能對虛擬函式給出有意義有實現,而把它說明為純虛擬函式,它的實現留給該基類的派生類去做。這就是純虛擬函式的作用。

抽象類

    帶有純虛擬函式的類稱為抽象類。抽象類是一種特殊的類,它是為了抽象和設計的目的而建立的,它處於繼承層次結構的較上層。抽象類是不能定義物件的,在實際中為了強調一個類是抽象類,可將該類的建構函式說明為保護的訪問控制權限。

    抽象類的主要作用是將有關的組織在一個繼承層次結構中,由它來為它們提供一個公共的根,相關的子類是從這個根派生出來的。

    抽象類刻畫了一組子類的操作介面的通用語義,這些語義也傳給子類。一般而言,抽象類只描述這組子類共同的操作介面,而完整的實現留給子類。

    抽象類只能作為基類來使用,其純虛擬函式的實現由派生類給出。如果派生類沒有重新定義純虛擬函式,而派生類只是繼承基類的純虛擬函式,則這個派生類仍然還是一個抽象類。如果派生類中給出了基類純虛擬函式的實現,則該派生類就不再是抽象類了,它是一個可以建立物件的具體類了。 
   在有些情況下不想把基類置為抽象類,增加子類功能的靈活性,使用純虛擬函式就不夠方便了,可以使用普通虛擬函式而把方法體置空,格式如下:

      class <類名>
    {
        virtual <型別><函式名>(<引數表>) { }
        …
    };

這樣子類就可以選擇性的重定義函式體,同時也保證了類本身不是抽象類,增加靈活性。