【校園招聘】一道筆試題看c++中virtual覆蓋
#include<iostream>
using namespace std;
class A
{
public:
void virtual f()
{
cout<<"A"<<endl;
}
};
class B:public A
{
public:
void /*virtual*/ f() //virtual可以省略,也可以不省略,效果相同。
{
cout<<"B"<<endl;
}
};
int main()
{
A *pa = new A();
pa->f();
B *pb = (B*)pa;
pb->f();
delete pa,pb;
pa = new B();//多型
pa->f();
pb = (B*)pa;
pb->f();
return 0;
}
本題的答案是:AABB
Virtual是C++ OO機制中很重要的一個關鍵字。只要是學過C++的人都知道在類Base中加了Virtual關鍵字的函式就是虛擬函式(例如函式print),於是在Base的派生類Derived中就可以通過重寫虛擬函式來實現對基類虛擬函式的覆蓋。當基類Base的指標point指向派生類Derived的物件時,對point的print函式的呼叫實際上是呼叫了Derived的print函式而不是Base的print函式。這是物件導向中的多型性的體現。(關於虛擬機器制是如何實現的,參見Inside the C++
Object Model ,Addison Wesley 1996)
class Base
{
public:Base(){}
public:
virtual void print(){cout<<"Base";}
};
class Derived:public Base
{
public:Derived(){}
public:
void print(){cout<<"Derived";}
};
int main()
{
Base *point=new Derived();
point->print();
}
Output:
Derived
這也許會使人聯想到函式的過載,但稍加對比就會發現兩者是完全不同的:
(1) 過載的幾個函式必須在同一個類中;
覆蓋的函式必須在有繼承關係的不同的類中
(2) 覆蓋的幾個函式必須函式名、引數、返回值都相同;
過載的函式必須函式名相同,引數不同。引數不同的目的就是為了在函式呼叫的時候編譯器能夠通過引數來判斷程式是在呼叫的哪個函式。這也就很自然地解釋了為什麼函式不能通過返回值不同來過載,因為程式在呼叫函式時很有可能不關心返回值,編譯器就無法從程式碼中看出程式在呼叫的是哪個函式了。
(3) 覆蓋的函式前必須加關鍵字Virtual;
過載和Virtual沒有任何瓜葛,加不加都不影響過載的運作。
相關文章
- 大學校園無線覆蓋解決方案
- 搜狗2012校園招聘自測題
- 【JAVA】【華為校園招聘筆試-軟體】2020-09-09Java筆試
- 公園無線覆蓋維護問題
- GBASE校園招聘,正式啟動!
- 嗶哩嗶哩校園招聘
- 梧桐果:2021屆中國校園招聘報告
- 【JAVA】騰訊2021校園招聘-後臺&綜合-第二次筆試Java筆試
- [小米集團校園招聘] 射頻測試工程師 (急招)工程師
- 【小米集團校園招聘】射頻測試工程師 (急招)工程師
- 學校無線網路覆蓋方案
- 一道新奇的招聘題
- 從一道筆試題題說起筆試
- 程式碼覆蓋率與測試覆蓋率比較
- c++筆試題C++筆試
- [小米集團校園招聘] 軟體開發工程師-C/C++ 方向 (急招)工程師C++
- 【小米集團校園招聘】軟體開發工程師-C/C++ 方向 (急招)工程師C++
- 線段覆蓋問題
- 棋盤覆蓋問題
- 企業WiFi覆蓋,解決覆蓋四大難題WiFi
- 北森:2022中國企業校園招聘白皮書(附下載)
- 北森:2021中國企業校園招聘白皮書(附下載)
- C++語言的單元測試與程式碼覆蓋率C++
- [廣州、成都、武漢] 多益網路22屆校園招聘 程式類10+崗位(直通筆試!)筆試
- 精準測試之覆蓋
- 面安服的一道筆試題筆試
- C++之過載覆蓋和隱藏C++
- 自動化會提高測試覆蓋率,那測試覆蓋率是什麼?
- mysql覆蓋索引之看山還是山MySql索引
- JS基礎知識(覆蓋JS基礎面試題)JS面試題
- 學校學生宿舍無線覆蓋解決方案
- 學校報告廳無線覆蓋解決方案
- 用友&拉勾招聘:2023校園招聘調研報告&備戰攻略(附下載)
- go 程式碼覆蓋率測試Go
- 單元測試接入覆蓋率
- Jacoco--測試覆蓋率工具
- MySQL-覆蓋索引總結筆記MySql索引筆記
- 如何使公園無線AP全覆蓋更有價值?
- 【離散優化】覆蓋問題優化