公共繼承,相當於屬於關系。如CLASS B:public A,表示B就是A,A做到的,B也能做到。
CLASS A {}; CLASS B:public A {}; A a; B b; a=b;//錯誤,因為a不一定是b b=a;//正確,b就是a
public繼承下,會出現名字覆蓋:B與A若有同名函數,則A中的該函數將被覆蓋,包括A中該函數的重載函數。
關於虛函數
含有純虛函數如: virtual void fun()=0; 的類是抽象類,我們不能創建抽象類的對象。若A中有純虛函數,則A a=new A是錯的,而A a=new B才是正確的。
純虛函數:
派生類中必須重新聲明該函數。(聲明一個純虛函數的目的是為了讓派生類只繼承接口)
純虛函數的實現,需要申請才能使用,如下所示
CLASS A { virtual void fun()=0; }; void A::fun() { //實現 } CLASS B { virtual void fun() { A::fun();//需要聲明使用A的實現 } }; CLASS C { virtual void fun();//可以自己實現 }; void C::fun() { //C的fun }
非純虛函數:
派生類會繼承該函數的聲明與實現,可自己實現以覆蓋。不安全的原因是:派生類忘記自定義繼承過來的函數時,會使用默認的實現(即基類的實現)。而此 默認的函數實現可能不適合此派生類。
非虛函數:
抽象類(只能是抽象類)會強制派生類繼承該類的非虛函數,即抽象類的非虛函數將會覆蓋所有派生類的同名函數,此做法剛好與非抽象類的繼承相反。
總結:
在公共繼承下,純虛函數、非純虛函數和非虛函數在抽象類的繼承當中的作用分別是:只繼承接口、繼承接口與默認實現、繼承接口及強制實現。