【校園招聘】一道筆試題看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沒有任何瓜葛,加不加都不影響過載的運作。
相關文章
- 大學校園無線覆蓋解決方案
- 各大IT公司2012校園招聘筆試面試整理筆試面試
- 百度2011.10.16校園招聘會筆試題筆試
- 百度2013校園招聘筆試題[軟體研發]及答案筆試
- 校園招聘的思考
- 【JAVA】【華為校園招聘筆試-軟體】2020-09-09Java筆試
- 華為2016校園招聘上機筆試題:簡單錯誤記錄 [python]筆試Python
- 2014百度校園招聘筆試題(上海軟體研發工程師)筆試工程師
- C++中的覆蓋和隱藏C++
- 【JAVA】騰訊2021校園招聘-後臺&綜合-第二次筆試Java筆試
- 百度筆試題:繩子最多覆蓋多少個點筆試
- 微軟2016校園招聘4月線上筆試 hihocoder 1289 403 Forbidden微軟筆試ORB
- 學校無線網路覆蓋方案
- 華為2018屆校園招聘筆試題目以及相應程式碼分享 軟體開發崗位筆試
- 【資料庫】網易校園招聘筆試題--資料庫事務的定義,屬性,以及隔離級別資料庫筆試
- 程式碼覆蓋率與測試覆蓋率比較
- 【小米集團校園招聘】射頻測試工程師 (急招)工程師
- [小米集團校園招聘] 射頻測試工程師 (急招)工程師
- [廣州、成都、武漢] 多益網路22屆校園招聘 程式類10+崗位(直通筆試!)筆試
- 微軟2016校園招聘4月線上筆試 hihocoder 1288 Font Size (模擬)微軟筆試
- 微軟2016校園招聘4月線上筆試 hihocoder 1290 Demo Day (dp)微軟筆試
- 【演算法】2013創新工場校園招聘筆試題--如何求出帶環連結串列的入口節點演算法筆試
- 從一道筆試題題說起筆試
- 百度2015校園招聘面試題(成功拿到offer)面試題
- c++筆試題C++筆試
- EMC校招筆試題目筆試
- C++語言的單元測試與程式碼覆蓋率C++
- 企業WiFi覆蓋,解決覆蓋四大難題WiFi
- 2017年高頻率的網際網路校園招聘面試題面試題
- 【小米集團校園招聘】軟體開發工程師-C/C++ 方向 (急招)工程師C++
- [小米集團校園招聘] 軟體開發工程師-C/C++ 方向 (急招)工程師C++
- 面安服的一道筆試題筆試
- 一道TCL的筆試題---遞迴筆試遞迴
- go 程式碼覆蓋率測試Go
- 程式碼測試覆蓋率分析
- mysql覆蓋索引之看山還是山MySql索引
- 學校學生宿舍無線覆蓋解決方案
- 學校報告廳無線覆蓋解決方案