關於C++ 虛函數 子類和父類 一點小的總結

在C++中 虛函數是一個很重要的運用不部分,一般來實現多態。 關於虛函數,子類,父類指針之間的關係。 我找到了一種比較簡單易懂的解釋方式。 (摘錄自其他博客)
1,如果以一個基礎類指針指向一個衍生類對象(派生類對象),那麼經由該指針只能訪問基礎類定義的函數(靜態聯翩)
2,如果以一個衍生類指針指向一個基礎類對象,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合語法習慣,在程序設計上也會給程序員帶來困擾。(一般不會這麼去定義)
3,如果基礎類和衍生類定義了相同名稱的成員函數(包括參數相同),那麼通過對象指針調用成員函數時,到底調用那個函數要根據指針的原型來確定,而不是根據指針實際指向的對象類型確定。
4 虛函數就是爲了對“如果你以一個基礎類指針指向一個衍生類對象,那麼通過該指針,你只能訪問基礎類定義的成員函數”這條規則反其道而行之的設計。

關於純虛擬函數:
virtual void myfunc ( ) =0;
純虛擬函數不許定義其具體動作,它的存在只是爲了在衍生類鐘被重新定義。只要是擁有純虛擬函數的類,就是抽象類,它們是不能夠被實例化的(只能被繼承)。如果一個繼承類沒有改寫父類中的純虛函數,那麼他也是抽象類,也不能被實例化
抽象類不能被實例化,不過我們可以擁有指向抽象類的指針,以便於操縱各個衍生類。
虛擬函數衍生下去仍然是虛擬函數,而且還可以省略掉關鍵字“virtual”。


`
#include <iostream> 
using namespace std; 
class A 
{ 
public: 
    virtual void foo() 
    { 
        cout << "A's foo()" << endl; 
        bar(); 
    } 
    virtual void bar() 
    { 
        cout << "A's bar()" << endl; 
    } 
}; 
class B: public A 
{ 
public: 
    void foo() 
    { 
        cout << "B's foo()" << endl; 
        A::foo(); 
    } 
    void bar() 
    { 
        cout << "B's bar()" << endl; 
    } 
}; 
int main() 
{ 
    B bobj; 
    A *aptr = &bobj; 
    aptr->foo(); 
    A aobj = *aptr; //轉化爲A類對象
    aobj.foo(); 
}

“`
aptr->foo()輸出結果是:
B’s foo()//這個明白,多態性
A’s foo()//這個也明白,執行A::foo();
B’s bar()//雖然調用的是這個函數:A::foo(); 但隱式傳入的還是bobj 的地址,所以再次調用bar();調用時還是會調用B的函數, 與虛函數指針有關
aobj.foo()輸出結果是:
A’s foo() //這個不是指針,aobj完全是一個A的對象,與多態沒有關係
A’s bar()

記錄下,以便以後能理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章