C++必知必会之(21)重载与重写并不相同

本文解释了在编程中重载与重写的基本概念及它们之间的不同之处。重载发生在同一作用域内的多个函数名相同但签名不同;而重写是指派生类中的函数与基类中的虚函数名称和签名相同,从而改变了基类的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、重载与重写之间没有任何关系。


2、当同一个作用域内的两个或更多个函数名字相同但签名不同时,就会发生重载。

函数的签名由它所声明的参数(或形参)的数目和类型构成。

当编译器在一个作用域内查找一个函数名字时,发现不止一个函数具有该名字,它就会在该作用域内的可用候选函数中,选择其形参与函数调用中的实参有着最佳匹配的那一个函数,此为重载。


3、当派生类函数和基类虚函数具有相同的名字和签名时,就会发生重写。

在这种情况下,派生类函数的实现将会取代它所继承的基类函数的实现,以便满足对派生对象的虚拟调用。

重写机制改变类的行为而不改变其接口。


考虑如下简单的基类:

class B  {

    public:

        //.....

        virtual int f( int );          //、、、

        void f( B* );                  //、、、

        //.....

};

名字f在类B中被重载了,因为在同一个作用域内存在两个名字为f的不同函数。

加、的两行是糟糕的代码。原因有二:

也许并不希望重载一个虚函数,或者也可能并不希望在整型和指针类型之间进行重载。


class D   :     public  B   {

      publilc:

           int f ( int );

           int f ( B * );

};

成员函数D::f(int)重写了基类中的虚函数B::f(int)。成员函数D::f(B*)没有重写任何东西,因为B::f(B*)不是虚拟的。

然而,它重载了D::f(int)。

注意,它并不重载基类成员B::f,因为他们位于不同的作用域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值