2009年4月29日 星期三

C++ Override小筆記

這兩天在寫程式用到Override的時候,出了一些問題


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


沒有留言: