最近在寫模擬商店發出訊息的量測程式,使用JAVA來寫multi-thread Socket產生多條連線
JAVA可以說大學修完課後四年就沒在碰,那時也只會寫一般的數學運算並將結果印出來
所以可想而知,我是用C/C++的觀念在寫JAVA = ="
寫過C的人,應該都會覺得要站在巨人的肩膀上,才能寫出好程式
意思就是說,不透過別人現成寫好的source code來改的話
別說要寫好一個multi-thread socket,光單一條socket要建立連線就有得搞了 = ="
但這篇我主要是要講C++物件導向裡一個重要的觀念
老樣子,先隨便舉個之前的例子
class Car
{
public:
void CarInfo()
{
printf("-------------------------\n");
printf("一般普通房車 - 新款資訊\n");
printf("-------------------------\n");
}
};
class Honda : public Car
{
public:
void CarInfo()
{
printf("-------------------------\n");
printf("Honda房車 - 新款資訊\n");
printf("-------------------------\n");
}
};
Honda繼承了Car,而且又有相同的函式CarInfo()
所以父類別的CarInfo()會被override
那麼在main裡面輸入下面的程式碼,會印出什麼結果呢?
Car *mycar;
mycar = new Honda();
mycar->CarInfo();
將將將!! 答案是印出
-------------------------
一般普通房車 - 新款資訊
-------------------------
為什麼會是這樣的結果呢??
因為編譯器預設是早期連結(Early Binding),它是一個在編譯時期就需決定的方式
那要怎麼才能使用晚期連結呢(Late Binding),它是一個在執行時期才會得知所要調用的物件
其實很簡單,只要加入virtual虛擬函式宣告即可,如下
class Car
{
public:
virtual void CarInfo()
{
printf("-------------------------\n");
printf("一般普通房車 - 新款資訊\n");
printf("-------------------------\n");
}
};
這樣就能印出
-------------------------
Honda房車 - 新款資訊
-------------------------
Place your comment