C++ 的多态性与虚函数
????? 騰訊二面時(shí)被問(wèn)到關(guān)于C++的多態(tài)性和虛函數(shù),當(dāng)時(shí)腦袋發(fā)熱沒(méi)回答好,其實(shí)根本原因是這是很久之前看的,而且一直沒(méi)有應(yīng)用上,所以理所當(dāng)然說(shuō)不出個(gè)所以然來(lái)。趁著國(guó)慶假期,把C++草草撿了些回來(lái),現(xiàn)在主要說(shuō)下多態(tài)性和虛函數(shù)。
一、多態(tài)性:
???? 顧名思義,多態(tài)的意思的一個(gè)事物有多種形態(tài)。在C++中,多態(tài)性是指具有同功能的函數(shù)可以用同一個(gè)函數(shù)名,這樣就可以用一個(gè)函數(shù)名調(diào)用不同內(nèi)容的函數(shù)。即向不同的對(duì)象發(fā)送同一個(gè)消息,不同的對(duì)象在接收會(huì)產(chǎn)生不同的行為。(通俗:當(dāng)學(xué)校校長(zhǎng)向社會(huì)發(fā)布一個(gè)消息:9月1號(hào)開(kāi)學(xué)。不同的對(duì)象會(huì)做出不同的響應(yīng):學(xué)生準(zhǔn)備好課本回學(xué)校上課,老師備好課回學(xué)校教學(xué)……)
???? 多態(tài)性分兩類:靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性。
靜態(tài): 如函數(shù)重載和運(yùn)算符重載實(shí)現(xiàn)的多態(tài)性屬于靜態(tài)多態(tài)性,在程序編譯時(shí)系統(tǒng)就能決定調(diào)用的是哪個(gè)函數(shù),因此靜態(tài)多態(tài)性又稱編譯時(shí)的多態(tài)性。
動(dòng)態(tài): 動(dòng)態(tài)多態(tài)性的程序運(yùn)行過(guò)程中才動(dòng)態(tài)確定操作所針對(duì)的對(duì)象,所以多態(tài)多態(tài)性又稱運(yùn)行時(shí)的多態(tài)性。動(dòng)態(tài)多態(tài)性是通過(guò)虛函數(shù)實(shí)現(xiàn)的。
二、虛函數(shù)
虛函數(shù)的作用允許在派生類中重新定義與基類同名的函數(shù),并且可以通過(guò)基類指針或引用來(lái)訪問(wèn)基類和派生類中的同名函數(shù)。
虛函數(shù)的聲明: virtual 函數(shù)類型 函數(shù)名();
C++規(guī)定,當(dāng)一個(gè)成員函數(shù)被聲明為虛函數(shù)后,其派生類中的同名函數(shù)都自動(dòng)成為虛函數(shù)。
純虛函數(shù)是在聲明虛函數(shù)時(shí)被“初始化”為0的函數(shù) :virtual 函數(shù)類型 函數(shù)名(參數(shù)列表) =0;
PS:(1)純虛函數(shù)沒(méi)有函數(shù)體,只有函數(shù)的而不具備函數(shù)的功能,不能被調(diào)用。只有在派生類中對(duì)此函數(shù)提供定義后,它才具備函數(shù)的功能,?可以被調(diào)用。(2)凡是包含純虛函數(shù)的類都是抽象類,因?yàn)榧兲摵瘮?shù)不能被調(diào)用,所以抽象類是無(wú)法建立對(duì)象的。
1 //聲明基類 Person
2 class Person
3 {
4 public:
5 Person(int,string);
6 virtual void display(); //聲明為虛函數(shù)
7 protected:
8 int age;
9 string name;
10 };
11 Person::Person(int n,string nam):age(n),name(nam);
12 void Person::display()
13 {
14 cout<<"age:"<<age<<" name:"<<name<<endl;
15 }
16 //聲明派生類Student
17 class Student:public Student
18 {
19 public:
20 Student(int,string,float);
21 void display(); //虛函數(shù)
22 private:
23 float score;
24 };
25 Student::Student(int n,string nam,float s):Person(n,nam),score(s){}
26 void Student::display()
27 {
28 cout<<"age:"<<age<<" name:"<<name<<" score:"<<score<<endl;
29 }
30
31 int main()
32 {
33 Person p (20,"Zhang");
34 Student s (25,"Wang",95);
35 Person *pt = &p;
36 pt->display();
37 pt = *s;
38 pt->display();
39 return 0;
40 }
輸出結(jié)果為:age:20 name:Zhang
??????????age:25 name:Wang score:95
如果第6行代碼寫成:void display(); 即不把display聲明為虛函數(shù),
則輸出結(jié)果為:age:20 name:Zhang
??????????? age:25 name:Wang
?
轉(zhuǎn)載于:https://www.cnblogs.com/caixia/archive/2011/10/06/2200221.html
總結(jié)
以上是生活随笔為你收集整理的C++ 的多态性与虚函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二叉树的左右子树交换
- 下一篇: 从三层架构到MVC