記憶深刻的兩道題:
1.如下程式的輸出是什麼:
解釋一下:基類指標指向子類物件,c++按照先基類後子類的方式建立物件,在構造基類物件的過程中呼叫基類構造方法,這個時候虛函式表還沒有被子類虛函式指標替換,呼叫的還是基類物件的函式。於是輸出兩個base。之後輸出兩個子類物件呼叫的方法。析構的時候由於基類物件的建構函式沒有宣告為虛函式(見effective c++ item37),所以當基類指標指向子類物件的時候,釋放這個基類指標就會呼叫基類的析構函式而不會呼叫子類的析構函式,c++把這個物件當做了基類來處理,虛機制沒有派上用場,最後輸出兩個base。如果在base的析構函式前加上virtual關鍵字,那麼輸出如下:
析構的時候會先呼叫子類的析構函式進行析構,析構之後再呼叫基類的析構函式析構,這個時候c++把這個半沒析構半被析構的物件當做基類來看待,所以其虛機制也就作廢了,因此呼叫到的還是基類的base foo。
根據effective c++ item9 的說法,不要在任何建構函式和析構函式中呼叫虛函式,這樣會引起非預期的輸出,詳見
引用其中最重要的一段話:
「事實上還有比這更具基本的要求。在派生類物件的基類物件構造過程中,該類的型別是基類型別。不僅虛函式依賴於基類,而且使用執行時刻資訊的語言的相應部分(例如,dynamic_cast(參見item 27)和typeid)也把該物件當基類型別對待。在我們的示例中,當transaction的構造器正執行以初始化buytransaction物件的基類部分時,該物件是transaction型別。在c++程式設計中處處都這樣處理,這樣做很有意義:在基類物件的初始化中,派生類物件buytransaction相關部分並未被初始化,所以其時把這些部分當作根本不存在是最安全的。 在乙個派生類物件的構造器開始執行之前,它不會成為乙個派生類物件的。
在物件的析構期間,存在與上面同樣的邏輯。一旦乙個派生類的析構器執行起來,該物件的派生類資料成員就被假設為是未定義的值,這樣以來,c++就把它們當做是不存在一樣。一旦進入到基類的析構器中,該物件即變為乙個基類物件,c++中各個部分(虛函式,dynamic_cast運算子等等)都這樣處理。」
第二題:
#include #include深度遍歷,弱爆了,其實沒有徹底遍歷,找到一條可行路線則立馬退出,和規則的設定順序有關係,應該全部遍歷然後找最小的那個#include
using
namespace
std;
enum
statekind
;class
state
~state(){};
bool
testconflict()
if ((localbeast > localman && localman>0) || (oppbeast > oppman && oppman>0
))
else
}bool
testend()
else
}state*switchnextstate()
}if (statekind ==back)}}
intlocalman;
intlocalbeast;
intoppman;
intoppbeast;
intstatenum;
intbackstatenum;
statekind statekind;
};bool alreadypushed(std::vector& alradypushed,state*nextstate)
}return
false;}
intmain()
else
currentstate=null;
currentstate=statestack.top();
}else
}else
printf(
"在(%d,%d,%d,%d)狀態衝突,回退!\n
",nextstate->localman,nextstate->localbeast,nextstate->oppman,nextstate->oppbeast);
currentstate=statestack.top();}}
}while(!statestack.empty())
}return0;
}
360筆試題回憶版
1 個人感覺360的c 重點考得是動態聯編,繼承,虛函式之類的,本來已經對360放棄了,可是居然在凌晨4點失眠的時候收到了他的筆試通知,雖然我知道360給所有人都發了筆試通知,但我還是抱著想看一看它的考題的心態參加了考試,所以,重點變成了研究考題,而不是考試,下面是我憑回憶記下的考題,最難的筆試是喜...
360筆試題 字元置換
題目描述 字串由 和ascii碼字母構成,若每次操作將字串 現連續兩個 則以 替代,則可以將函式f s 定義為使得串中不出現連續2個 的最小置換次數。現考慮m個字元替換操作,每次將指定位置的字元替換為給定字元,求替換後函式的f s 的值。輸入 輸入有若干組,第一行為2個整數n和m,n表示字串長度,m...
兩則面試題 動態規劃
某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞...