虞城網(wǎng)站建設(shè)廣州最新重大新聞
多態(tài)一定會成功嗎
因?yàn)檫壿嬍怯脩艟帉懙?#xff0c;那么肯定會有遺漏的地方,那就要規(guī)則來限制。就比如多態(tài),都知道條件之一是子類重寫了父類的虛函數(shù),但是如果子類沒有嚴(yán)格遵守這個規(guī)則,就無法達(dá)到目的。就比如這個代碼:
class A {
public:virtual void aaa(int i) const{cout << "aaa" << endl;}};
class B :public A {virtual void aaa(int i) {cout << "bbb" << endl;}
};
void help(A& a){a.aaa(11);
}
int main(){B b;help(b);return 0;
}
剛開始看會以為這是個多態(tài),但其實(shí)這并不是,會打印aaa而不是bbb。
為什么呢?因?yàn)閍aa函數(shù)并沒有被嚴(yán)格地重寫:const屬性丟失了。
這其實(shí)挺難發(fā)現(xiàn)的,因?yàn)榫幾g器也并不會去給我們指出來,畢竟多態(tài)也并不是一定要實(shí)現(xiàn)。
所以這時候就體現(xiàn)override的作用,添加override后:
還有一種好處是:能讓人知道這個函數(shù)是重寫并且是用作多態(tài)的。
雖然子類直接覆蓋父類的虛函數(shù)但是不加virtual也能達(dá)到多態(tài):
// 輸出bbb
class A {
public:virtual void aaa(int i){cout << "aaa" << endl;}};
class B :public A {void aaa(int i){cout << "bbb" << endl;}
};
但是這樣會更直觀:
// 輸出bbb
class A {
public:virtual void aaa(int i){cout << "aaa" << endl;}
};
class B :public A {void aaa(int i) override{cout << "bbb" << endl;}
};