函数重载:
1. 作用域相同(同一类中)
2. 参数不同(类型或者个数)
3. 函数名相同
4. 基类关键字Virtual关键字可有可无
函数覆盖:子类覆盖父类的同名函数(虚函数),同名+同参
1. 作用域不同(子类和父类)
2. 参数相同
3. 函数名相同
4. 基类中的函数必须有virtual关键字
以上部分摘自 《C/C++高效编程》
class Animal
{
public:
virtual void sleep() { cout << "Animal::sleep()" << endl;}
};
class Dog : public Animal
{
public:
virtual void sleep() { cout << "Dog::sleep()" << endl;} //函数重载
};
函数隐藏:子类与父类具有同名函数(不管参数是否相同)
注意与函数覆盖相区分:
1. 派生类的函数与基类函数完全相同(同名且参数相同),只是基类函数没有使用virtual关键字。此时,基类的函数将被隐藏,而不是覆盖。
2. 派生类的函数与基类只是同名(参数不同),这种情况下,无论基类函数是否使用virtual关键字,基类的函数都被隐藏。
class Animal
{
public:
void sleep() { cout << "Animal::sleep()" << endl;}
void eat(int a) { cout << "Animal::eat()" << endl;}
};
class Dog : public Animal
{
public:
void sleep() { cout << "Dog::sleep()" << endl;} //与基类函数完全相同,函数隐藏
void eat() { cout << "Dog::eat()" << endl;} //与基类函数同名但不同参,函数隐藏
};