C++中的override與java等其他的OOP語言有一些不一樣,舉個例子來說,比如你有下面這個代碼:
/*************************************************************************
> File Name: test.cpp
> Author: Baniel Gao
> Mail: [email protected]
> Created Time: Mon 22 Aug 2016 09:58:20 PM CST
************************************************************************/
#include <iostream>
using namespace std;
class A {
public:
A():i(0) {
cout << "A::A()" << endl;
}
~A() {
cout << "A::~A()" << endl;
}
void print() {
cout << "class A i: " << i << endl;
}
void print(int ii) {
cout << "class A i: " << i << ", ii: " << ii << endl;
}
protected:
int i;
};
class B : public A {
public:
void print() {
cout << "class B i: " << i << endl;
}
};
int main()
{
A a;
B b;
a.print();
a.print(1);
b.print();
b.print(2);
return 0;
}
如果你瞭解JAVA的話,很容易會覺得這個程序沒有問題,但是編譯的時候出現下面的錯誤:
這裏我們g++給出的錯誤不是很友好,但是我們還是能夠依稀明白些什麼。它的意思是說,你要在第47行,也就是b.print(2);這行,要調用帶有int參數的print函數,但是找不到!!有java的基礎,這裏總是感覺十分別扭!!在C++中的override,和java中是很不一樣的,在C++中如果你定義個一個名稱和父類相同的函數時,那麼你就將父類的同名方法在此類中全部覆蓋了!!即使返回值不一樣也不行!!如果還是想要使用父類的帶有int參數的print函數怎麼辦呢?有辦法,可以這麼調用:
b.A::print(2);
好吧,我承認這是一個很噁心人的語法,至少在一個寫慣了java程序的人看來!!但是,這確實是一個巨大的坑,在項目中十足被坑了一把!!!