c++虛函數和純虛函數的幾點說明
概念
虛函數
在類的成員函數定義前加 virtual 關鍵字,該函數將被作為虛函數。虛函數被繼承後仍為虛函數。虛函數的在子類中可以被override(覆蓋)、overload (重載 )
virtual string toString(){
}
1
2
3
純虛函數
純虛函數除了有virtual 關鍵字外,還令它等於0,以表為純虛函數。擁有純虛函數的類稱為 抽象類 。抽象類不能被實例化。類的繼承往往越往後越具體,相反地,越往祖先越抽象,以至於沒法實例代,其實也根本沒必要實例化。按照某本書上所說,之所以定義抽象類,是為了給以後的子類留下公共介面。我想有一定道理。
virtual string toString()=0;
1
一般地,我們不希望純虛函數的構造函數暴露。所以我們把構造函數設為 protected
class test {
int property1;
int attribute2;
virtual string toString() = 0;
protected:
test() {}
test(int p1, int p2) {
property1 = p1;
attribute2 = p2;
}
};
1
2
3
4
5
6
7
8
9
10
11
純虛函數被繼承後為 虛函數 ,請看下例。我們並沒有給類 sun 類中的 toString() 函數 virtual關鍵字卻實現了多態*,可見其從test類中繼承了的toString()函數為虛函數。
#include<iostream>
#include<string>
using namespace std;
class test {
virtual string toString() = 0;
};
struct child:test {
string toString() {
return "ccc";
}
};
struct sun:child
{
string toString() {
return "sss";
}
};
int main() {
sun s;
child* c;
c = &s;
cout<<c->toString()<<endl;
system("pause");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
結果:
注意
重載函數雖同名,但其實是不同的函數,我們讓其中一種成為虛函數或者純虛函數,其它的同名函數(如果其它的都不加virtual)並不會成為虛函數或者純虛函數。在子類中,若重載了繼承過來的虛函數,那麼新的重載形式(即你的在子類中定義而在父類中沒有的同名函數)的函數不會是虛函數。在此就不再實驗,讀者自證之。
打開今日頭條,查看更多精彩圖片※nginx log記錄請求響應時間
※pc端通過拖放實現添加、刪除功能
TAG:程序員小新人學習 |