1. 重载 overload
重载的构成条件:在同一个作用域下的函数,函数名相同,参数列表不同构成重载;
重载原理:C++编译代码时生成的符号名由函数名+参数列表组成,所以只要生成的符号不一样,那么就可以重载,不会产生编译问题,与返回值无关;
重载代码示例:
class Base {
public:
Base(int data) :ma(data) { cout << "Base(int data)" << endl; }
Base() = default;
~Base() { cout << "~Base()" << endl; }
void show() { cout << "Base::show()" << endl; }
void show(int val) { cout << "Base::show(int)" << endl; }
protected:
int ma;
};
class Deriver :public Base {
public:
Deriver(int data) :mb(data), Base(data) { cout << "Deriver(int data)" << endl; }
~Deriver() { cout << "~Deriver()" << endl; }
void show(int a, int b, int c) { cout << "Deriver::show(int,int,int)" << endl; }
private:
int mb;
};
在Base类中,Base::show()
和Base::show(int)
构成重载,但是不与Deriver::show(int,int,int)
构成重载,原因是因为不在同一作用域,但是构成隐藏,就是接下来要讲的这种。
2. 隐藏 overhide
隐藏的构成条件:派生类中含有与基类同名的方法,编译器会优先选择使用派生类中同名方法,看上去派生类将基类的同名方法隐藏。
只要函数名相同即可构成隐藏,与函数返回值和参数列表无关,如果一定要调用基类的方法,可以在方法前加类作用域,明确的告诉编译器我们要使用基类的方法,否则编译器默认使用派生类方法。
class Base {
public:
Base(int data) :ma(data) { cout << "Base(int data)" << endl; }
Base() = default;
~Base() { cout << "~Base()" << endl; }
void show() { cout << "Base::show()" << endl; }
void show(int val) { cout << "Base::show(int)" << endl; }
protected:
int ma;
};
class Deriver :public Base {
public:
Deriver(int data) :mb(data), Base(data) { cout << "Deriver(int data)" << endl; }
~Deriver() { cout << "~Deriver()" << endl; }
void show(int a, int b, int c) { cout << "Deriver::show(int,int,int)" << endl; }
int show(bool flg) { cout << "Deriver::show(bool)" << endl; return 0; }
private:
int mb;
};
int main() {
Deriver d(100);
//Deriver::show
d.show(true);
d.show(1,2,3);
//Base::show
d.Base::show();
d.Base::show(99);
return 0;
}
隐藏不包括覆盖这种情况,判断隐藏时先要将重写去掉,接下来将什么是重写。
3. 重写,也叫覆盖 override
重写构成条件:
- 大前提,一个方法A在基类中是虚函数
- 子类中存在一个与父类的那个虚函数返回值、参数列表相同的函数B,则父类虚函数A被子类继承后被B函数覆盖。
- 子类方法B此时也是一个虚函数。
class Base {
public:
Base(int data) :ma(data) { cout << "Base(int data)" << endl; mc = data; }
~Base() { cout << "~Base()" << endl; }
virtual void show() { cout << "Base::show()" << endl; } //在子类中被重写的show方法
void show(int val) { cout << "Base::show(int)" << endl; } //被子类隐藏的show方法
int mc;
protected:
int ma;
};
class Deriver :public Base {
public:
Deriver(int data) :mb(data), Base(data) { cout << "Deriver(int data)" << endl; }
~Deriver() { cout << "~Deriver()" << endl; }
void show(){ cout << "Deriver::show()" << endl; } //也是一个虚函数
private:
int mb;
};