memset() 初始化類物件
今天看到迅雷2014校招一道筆試題如下:
- #include <iostream>
- usingnamespace std;
- class parent
- {
- public:
- virtualvoid output();
- };
- void parent::output()
- {
- printf("parent!");
- }
- class son : public parent
- {
- public:
- virtualvoid output();
- };
- void son::output()
- {
-
printf("son!"
- }
- int main()
- {
- son s;
- memset(&s , 0 , sizeof(s));
- parent& p = s;
- p.output();
- return 0;
- }
輸出程式執行結果:程式不輸出結果,執行出錯!!分析一下原因:
在使用memset初始化物件Obj之前,通過Obj呼叫Show和Print函式時程式執行正常,但是一旦利用Memset函式初始化該物件,再對該obj呼叫Show和Print函式,則程式立馬崩潰。究其原因是因為初始化obj的時候,將obj包含的指向虛擬函式表VTBL的指標也清除了
這種現象在很多由C轉向C++的程式設計師來說,很容易犯這個錯誤,而且這個錯誤很難查。
為了避免這種情況,記住對於有虛擬函式的類物件,決不能使用memset來進行初始化操作。而是要用預設的建構函式或其它的init例程來初始化成員變數。
當類中有虛擬函式的時候,編譯器會為類插入一個我們看不見的資料並建立一個表。這個表就是
合併兩家說法