class Parent{
virtual void say(){
cout<<"I am Parent" ;
}
};
class Children:public Parent{
virtual void say(){
cout<<"I am Children" ;
}
};
.....
int main(){
Parent p=Children();
p.say();
}
根據之前java的習慣,以為這樣就可以override了
但是出來的結果竟然是
I am Parent
後來找了很久,原來C++的override是建立在指標物件之上
程式必須改成
int main(){
Parent* p=new Children();
p.say();
}
這樣出來的結果才會正確
順便介紹一個名詞
Pure virtual function
也就是virtual function不實作內容,他的子類別一定必須實作這個函式
其長相大概如下
virtual void f() = 0;
或是
virtual void f(){}\\在此只是不實作
為何可以這樣呢?
原來virtual宣個出來的函式會變成一個指標函式
一般函式宣告出來後不會在class使用空間,但是這個virtual函式卻會
因為他會變成一個指標的存在,所以可以給他指定值0(NULL)
pure的虛擬函式一定要由子類別來定義 否則無法用來宣告變數(指標可以)
參考文章:http://blog.yam.com/swwuyam/article/12114648
舉個簡單的範例
class Test{};
int main{
cout<<"sizeof(Test)" ;
}
\\Output:1 原生空類別會佔掉1byte空間
class Test{
int data;
void f(){}
};
int main{
cout<<"sizeof(Test)" ;
}
\\Output:4 有member會依據member而決定size 在此一般函式不佔class的空間
class Test{
int data;
virtual void f(){}
};
int main{
cout<<"sizeof(Test)" ;
}
\\Output:8 f變成虛擬函式,變成一個指標而多佔了4byte
沒有留言:
張貼留言