overload、overwrite、override

时间:2022-08-21 16:27:55

1、重载 overload

函数名一样,参数不同(类型、顺序,c++类中还有const函数,与返回值类型无关),重载的函数在同一个作用域(同一个类或在同一cpp文件中)

class A
{
public:
void test() {}
void test(int n) {}
void test() const {}
int test(int m) { return ;} // error,和上一个函数参数相同,非法的重载
};

2、覆盖 override

派生类与基类函数同名,参数相同,且基类函数由virtual修饰,覆盖就是常说的虚函数

class A
{
public:
  virtual void test() {}
  void test(int n) {}
}; class B : public A
{
public:
  void test() {} // override
}; B b;
b.test(); // 调用B中的test
b.test(); // error
b.A::test(); // right 调用被隐藏的基类函数 B *b2= new B() ;
dynamic_cast<A*>(b2)->test(); // 调用B中的test

3、重写 overwrite

派生类与基类函数同名,则屏蔽基类函数(虚函数除外,即当基类函数与派生类函数参数相同,且基类为虚函数时,则为覆盖)

此种情况应避免,按照c++设计思想,基类非virtual函数,子类是不需要修改的

class A
{
public:
  void test() {}
  void test(int n) {}
}; class B : public A
{
public:
  void test() {} // overwrite
}; B b;
b.test(); // 只能调用B的test函数
static_cast<A>(b).test(); // 调用A的test函数
b.test();// error 基类同名函数被屏蔽了 B *b2= new B() ;
dynamic_cast<A*>(b2)->test(); // 调用A中的test