<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
阿里雖然是國內Java的第一大廠但是並非所有的業務都是由Java支撐,很多服務和中下層的儲存,計算,網路服務,大規模的分散式任務都是由C++編寫。在阿里所有部門當中對C++考察最深的可能就是阿里雲。
阿里對C++的常考點:
1.STL 容器相關實現
2.C++新特性的瞭解
3.多型和虛擬函式的實現
4.指標的使用
現在假設有一個編譯好的C++程式,編譯沒有錯誤,但是執行時報錯,報錯如下:你正在呼叫一個純虛擬函式(Pure virtual function call error),請問導致這個錯誤的原因可能是什麼?
純虛擬函式呼叫錯誤一般由以下幾種原因導致:
注意:其中1,2編譯器會檢測到此類錯誤。3,4,5編譯器無法檢測出此類情況,會在執行時報錯。
編譯器在編譯時期為每個帶虛擬函式的類建立一份虛擬函式表
範例化物件時, 編譯器自動將類物件的虛表指標指向這個虛擬函式表
1.構造基礎類別部分:
2.遞迴構造派生類部分:
1.遞迴解構派生類部分:
2.解構基礎類別部分:
建構函式和解構函式執行函數體時,範例的虛擬函式表指標,指向建構函式和解構函式本身所屬的類的虛擬函式表,此時執行的虛擬函式,即呼叫的本身的該類本身的虛擬函式,下面是一個【間接呼叫】的栗子:基礎類別中的解構函式中,呼叫純虛擬函式(該虛擬函式就在基礎類別中定義)。
#include <iostream> using namespace std; class Parent { public: //純虛擬函式 virtual void virtualFunc() = 0; void helper() { virtualFunc(); } virtual ~Parent(){ helper(); } }; class Child : public Parent{ public: void virtualFunc() { cout << "Child" << endl; } virtual ~Child(){} }; int main() { Child child; //system("pause"); return 0; }
執行時報錯:libc++abi.dylib: Pure virtual function called
:
在構造範例過程當中一部分是初始化列表一部分是在函數體內,你能說一下這些的順序是什麼?差別是什麼和this指標構造的順序
順序:
(1)初始化列表中的先初始化。
(2)執行函數體程式碼。
this
指標屬於物件,而物件還沒構造完成前,若使用this
指標,編譯器會無法識別。在初始化列表中顯然不能使用this
指標,注意:在建構函式體內部可以使用this
指標。建構函式的執行可以分成兩個階段:
#include <iostream> using namespace std; class Test1 { public: Test1(){ cout << "Construct Test1" << endl; } //拷貝建構函式 Test1& operator = (const Test1& t1) { cout << "Assignment for Test1" << endl; this->a = t1.a; return *this; } int a ; }; class Test2 { public: Test1 test1; //Test2的建構函式 Test2(Test1 &t1) { cout << "建構函式體開始" << endl; test1 = t1 ; cout << "建構函式體結束" << endl; } }; int main() { Test1 t1; Test2 test(t1); system("pause"); return 0; }
分析上面的結果:
(1)第一行結果即Test t1
範例化物件時,執行Test1
的建構函式;
(2)第二行程式碼,範例化Test2
物件時,在執行Test2
建構函式時,正如上面所說的,建構函式的第一步是初始化階段:所有類型別的成員都會在初始化階段初始化,即使該成員沒有出現在建構函式的初始化列表中。所以Test2在建構函式體執行之前已經使用了Test1的預設建構函式初始化好了t1。列印出Construct Test1
。
這裡的拷貝建構函式中可以使用
this
指標,指向當前物件。
(3)第三四五行結果:執行Test2
的建構函式。
初始化列表的寫法和順序有沒有什麼關係?
建構函式的初始化列表中的前後位置,不影響實際標量的初始化順序。成員初始化的順序和它們在類中的定義順序一致。
必須使用初始化列表的情況:資料成員是const
、參照,或者屬於某種未提供預設建構函式的類型別。
在普通的函數當中呼叫虛擬函式和在建構函式當中呼叫虛擬函式有什麼區別?
普調函數當中呼叫虛擬函式是希望執行時多型。而在建構函式當中不應該去呼叫虛擬函式因為建構函式當中呼叫的就是本型別當中的虛擬函式,無法達到執行時多型的作用。
成員變數,虛擬函式表指標的位置是怎麼排布?
如果一個類帶有虛擬函式,那麼該類範例物件的記憶體佈局如下:
如果將子類指標轉換成基礎類別指標此時編譯器會根據偏移做轉換。在visual studio,x64環境下測試,下面的Parent p = Child();
是父類別物件,由子類來範例化物件。
#include <iostream> using namespace std; class Parent{ public: int a; int b; }; class Child:public Parent{ public: virtual void test(){} int c; }; int main() { Child c = Child(); Parent p = Child(); cout << sizeof(c) << endl;//24 cout << sizeof(p) << endl;//8 Child* cc = new Child(); Parent* pp = cc; cout << cc << endl;//0x7fbe98402a50 cout << pp << endl;//0x7fbe98402a58 cout << endl << "子類物件abc成員地址:" << endl; cout << &(cc->a) << endl;//0x7fbe98402a58 cout << &(cc->b) << endl;//0x7fbe98402a5c cout << &(cc->c) << endl;//0x7fbe98402a60 system("pause"); return 0; }
結果如下:
24
8
0000013AC9BA4A40
0000013AC9BA4A48子類物件abc成員地址:
0000013AC9BA4A48
0000013AC9BA4A4C
0000013AC9BA4A50
請按任意鍵繼續. . .
分析上面的結果:
(1)第一行24為子類物件的大小,首先是虛擬函式表指標8B,然後是2個繼承父類別的int
型數值,還有1個是該子類本身的int
型數值,最後的4是填充的。
(2)第二行的8為父類別物件的大小,該父類別物件由子類初始化,含有2個int
型成員變數。
(3)子類指標cc
指向又new
出來的子類物件(第三個),然後父類別指標pp
指向這個子類物件,這兩個指標的值:
pp
值:0000013AC9BA4A48cc
值:0000013AC9BA4A40即發現如之前所說的:如果將子類指標轉換成基礎類別指標此時編譯器會根據偏移做轉換。我測試環境是64位元,所以指標為8個位元組。轉換之後pp和cc相差一個虛表指標的偏移。
(4)&(cc->a)
的值即 0000013AC9BA4A48,和pp
值是一樣的,注意前面的 0000013AC9BA4A40到0000013AC9BA4A47其實就是子類物件的虛擬函式表指標了。
阿里常考的C++的問題集中在以下幾點:
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45