继承中的名字隐藏、重定义、以及重定义与重载的区别


继承中的名字隐藏

1.基类同名函数被隐藏

对于下面的代码

class P 
{

public:

  void f() {}

};

class C :public P 
{

public:

  void f(int x) {}

};

int main() 
{

  C c;

  c.f();

}

 g++编译结果:

NameHiding.cpp:13:7: error: no matching function for call to 'C::f()'

(Visual C++编译结果:应该也是错的)

 这就是子类的同名函数隐藏了父类的同名函数(只同名就可以)

1.1. 内部作用域的名字隐藏外部作用域的(同名)名字)

(1) 派生类视作内部作用域

(2) 基类视作外部作用域 

2. Why?

(1)  避免某些潜在的危险行为

(2)  每个类在创建时,它的函数名都是写在一张干净的白纸上面,不会被基类函数名干扰

 

重定义函数

1. 重定义函数

      子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 )   重定义后子类调用的函数是子类自己的函数,父类的函数会被隐藏。名字隐藏特性。如果想调用父类的该同名函数,需要用父类加上作用域来指定调用的函数。

扫描二维码关注公众号,回复: 6785855 查看本文章

2. Redefine (重定义)

 

3. 重定义与重载

3.1. 重载函数

3.1.1. 多个函数名字相同

3.1.2. 但至少一个特征不同

(1) 参数类型

(2)参数数量

(3) 参数顺序

3.2. 重定义函数

3.2.1.函数特征相同

(1) 同名)

(2) 同参数:类型,数量和顺序

(3) 返回值类型 

3.2.2. 在基类和派生类中分别定义

虽然与上面重复,但还是总结如下为好:

 

函数重载:

必须在一个类中进行(子类无法重载父类中的函数)

子类无法重载父类的函数,父类同名函数将被子类的同名函数覆盖

重载是在编译期间根据参数类型,顺序,个数决定的函数调用

 

 

函数重写

必须发生于父类和子类之间

并且父类和子类中的函数必须有完全相同的函数签名

使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)

多态是在运行期间根据具体对象的类型决定函数调用

重写的同时一般会伴随发生函数重定义

 

函数重定义

必须发生于父类和子类之间

重定义不一定是多态

 

 

 

 

猜你喜欢

转载自blog.csdn.net/shanshenyuyou/article/details/95077767