【js9905com金沙网站】C++重载、重写、重定义,重

C++重载、重写、重定义,重载重写

一、重载(overload)
指函数名相近,不过它的参数表列个数或相继,类型分歧。不过不可能靠重临类型来判别。
(1卡塔 尔(阿拉伯语:قطر‎雷同的界定(在同叁个成效域中卡塔尔 ;
(2卡塔 尔(阿拉伯语:قطر‎函数名字肖似;
(3卡塔 尔(阿拉伯语:قطر‎参数分化;
(4卡塔 尔(英语:State of Qatar)virtual 关键字无关宏旨。
(5卡塔尔重回值能够分化;

二、重写(也称之为覆盖 override卡塔尔国
是嗾使生类重新定义基类的虚函数,特征是:
(1卡塔尔国不在同二个成效域(分别位于派生类与基类卡塔 尔(英语:State of Qatar) ;
(2卡塔 尔(英语:State of Qatar)函数名字相仿;
(3卡塔尔国参数形似;
(4卡塔尔基类函数必得有 virtual 关键字,不可能有 static 。
(5卡塔 尔(英语:State of Qatar)重回值相仿(或是协变卡塔 尔(英语:State of Qatar),否则报错;<—-协变那个定义小编也是率先次才知道…

(6卡塔 尔(英语:State of Qatar)重写函数的会见修饰符能够差别。就算 virtual 是 private 的,派生类中重写改写为 public,protected 也是能够的

三、重定义(也成掩瞒卡塔 尔(阿拉伯语:قطر‎
(1卡塔 尔(英语:State of Qatar)不在同叁个效能域(分别放在派生类与基类卡塔尔 ;
(2卡塔尔函数名字相符;
(3卡塔尔国重临值能够不一致;
(4卡塔尔国参数不同。那个时候,无论有无 virtual 关键字,基类的函数将被埋伏(注意别与重载以至覆盖混淆卡塔尔 。
(5卡塔尔国参数相近,不过基类函数未有virtual关键字。那时候,基类的函数被隐形(注意别与覆盖混淆卡塔 尔(英语:State of Qatar) 。

js9905com金沙网站 1

#include <iostream>
#include <complex>
using namespace std;

class Base
{
public:
    virtual void a(int x)    {    cout << "Base::a(int)" << endl;      }
    // overload the Base::a(int) function
    virtual void a(double x) {    cout << "Base::a(double)" << endl;   }
    virtual void b(int x)    {    cout << "Base::b(int)" << endl;      }
    void c(int x)            {    cout << "Base::c(int)" << endl;      }
};

class Derived : public Base
{
public:
    // redefine the Base::a() function
    void a(complex<double> x)   {    cout << "Derived::a(complex)" << endl;      }
    // override the Base::b(int) function
    void b(int x)               {    cout << "Derived::b(int)" << endl;          }
    // redefine the Base::c() function
    void c(int x)               {    cout << "Derived::c(int)" << endl;          }
};

int main()
{
    Base b;
    Derived d;
    Base* pb = new Derived;
    // ----------------------------------- //
    b.a(1.0);                              // Base::a(double)
    d.a(1.0);                              // Derived::a(complex)
    pb->a(1.0);                            // Base::a(double), This is redefine the Base::a() function
    // pb->a(complex<double>(1.0, 2.0));   // clear the annotation and have a try
    // ----------------------------------- //
    b.b(10);                               // Base::b(int)
    d.b(10);                               // Derived::b(int)
    pb->b(10);                             // Derived::b(int), This is the virtual function
    // ----------------------------------- //
    delete pb;

    return 0;
}

js9905com金沙网站 2

通过此处能够见到:

1.Base类中的第二个函数a是对第一个的重载
2.Derived类中的函数b是对Base类中函数b的重写,即使用了虚函数特性。
3.Derived类中的函数a是对Base泪中函数a的隐藏,即重定义了。
4.pb指针是一个指向Base类型的指针,但是它实际指向了一个Derived的空间,这里对pd调用函数的处理(多态性)取决于是否重写(虚函数特性)了函数,若没有,则依然调用基类。
5.只有在通过基类指针或基类引用 间接指向派生类类型时多态性才会起作用。
6.因为Base类的函数c没有定义为virtual虚函数,所以Derived类的函数c是对Base::c()的重定义。
转载地址:http://www.wutianqi.com/?p=3171

风姿罗曼蒂克、重载(overload卡塔 尔(阿拉伯语:قطر‎指函数名相像,可是它的参数表列个数或相继,类型不相同。然而不可能靠再次来到类型来判...

本文由js9905com金沙网站-金沙澳门手机版网址发布于计算机,转载请注明出处:【js9905com金沙网站】C++重载、重写、重定义,重

您可能还会对下面的文章感兴趣: