重载:作用域内,函数名相同,函数参数不同;
重写:父类的virtual成员函数,子类重写了函数体;
覆盖:1.子类重写父类函数后,将导致父类里被重写函数及其重载函数被覆盖;2.子类成员函数与父类成员函数,构成重载时,将导致父类里成员函数被覆盖;
class P {
public :
P() {}
virtual ~P() {}
virtual void foo() {cout << "P foo" << endl;} //函数1
void foo(int i) {cout << "P foo(int) " << endl;} //函数2
};
class C :public P {
public :
C() {}
virtual ~C() {}
void foo() {cout << "C foo" << endl;} //函数3
void foo(int i) {cout << "C foo " << i << endl;} //函数4
void foo(int i, int j) {cout << "C foo" << endl;} //函数5
};
函数1和函数3是重写;
函数1和函数2是重载,函数3,函数4和函数5是重载;
若注释掉函数4和函数5,在类C中, 类P的 函数2被覆盖;
class C :public P {
public :
C() {}
virtual ~C() {}
void foo() {cout << "C foo" << endl;} //函数3
//void foo(int i) {cout << "C foo " << i << endl;} //函数4
//void foo(int i, int j) {cout << "C foo" << endl;} //函数5
};
C c;
c.foo(1) // 函数2被覆盖,无法使用,编译错误