1. 继承:即父类实现的函数,在子类中即可调用。
2. 重载:相同作用内,如一个类中,函数名相同,但函数形参不同。
3. 覆盖:子类和父类中函数名相同,形参相同,基类中有virtual关键字,平常用的最多virtual实现的功能即是覆盖。
4. 隐藏:子类和父类的函数名相同,形参不同,无论基类中有无virtual关键字,此时父类中的函数被隐藏;
子类和父类的函数名相同,形参相同,父类中无virtual关键字(有关键字即为覆盖,此处可看出覆盖和隐藏的区别)
总述:
继承是基础,有了继承才牵扯出覆盖和隐藏,覆盖和隐藏就是对子类和父类中同名函数的处理;
重载和其他无相关性。
重载
相同作用域中,函数名相同,形参不同
如下代码中两个成员函数test作用域相同,一个形参是int i一个形参是float f,此种情况即为重载
class father
{
public:
void test(int i){}
void test(float f)();
}
覆盖
子类和父类中函数名相同,形参也相同,基类中有virtual关键字,平常用的最多virtual实现的功能即是覆盖
class father
{
public:
virtual void test(int i){}
}
class child : public father
{
public:
void test(int i){ printf("this is child"); }
}
child *c = new father();
c->test();
打印的结果为 “this is child”
隐藏
隐藏后,子类看不到父类中的函数
子类和父类的函数名相同,形参不相同,无论父类中有无virtual关键字,此时父类中的函数被隐藏
子类和父类的函数名相同,形参相同,父类中无virtual关键字,此时父类中的函数被隐藏(此处如果父类中有关键字,则即为覆盖)
父类中有函数test(),子类中有函数test(int i),此时实例化子类对象,子类对象是看不到父类中的test函数的;
父类中有函数virtual v_test(),子类中有函数v_test(int i),此时实例化子类对象,子类对象是看不到父类中的v_test函数的;
class father
{
public:
void test(){}
virtual void v_test(){}
}
class child : public father
{
public:
void test(int i){}
void v_test(int i){}
}