C++重载、重写、多态

1、重载(overload)

overload是重载,一般是在一个类实现若干重载的方法,这些方法的名称相同而参数形式不同。但是不能靠返回类型来判断。(返回值类型可以一致也可以不一致,但是参数列表必须不同)

重载需要注意:

(1) 位于同一个类中

(2) 函数的名字必须相同

(3) 形参列表不同

(4) 不同的构造函数(无参构造、有参构造、拷贝构造)是重载的应用

2、重写(override)

override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。

重写需要注意:

(1) 被重写的函数不能是static的,必须是virtual的

(2) 重写函数必须有相同的类型,名称和参数列表

(3) 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public、protect也是可以的

3、多态

多态发生的三个必要条件:

要有继承;

要有虚函数重写;

父类指针或引用 指向 子类对象;

#include
using namespace std;

struct Parent
{
    virtual void play()
    {
        cout << "play" << endl;
    }
};

struct Son : Parent
{
    void play()
    {
        cout << "play phone" << endl;
    }
};

int main() {
    Parent p;
    p.play();
    Son s;
    s.play();                 //父类和子类对象分别调用自己的play()方法,没有异议
    
    Parent p1 = s;
    p1.play();                //此处是对象的拷贝,依旧是父类对象调用父类的play()方法
    
    Parent* p2 = &s;          //父类指针指向子类的对象,与平时的指针定义并不相同。类型* p = &类型(相同类型)
    p2->play();               //此时就产生了多态,申明的父类指针却能够调用子类的play()方法
    
    Parent &p3 = s;           //与上述相同,利用父类的引用指向子类对象。
    p3.play();

    Parent *p4 = new Son();   //利用new返回的是对象的地址,所以需要申明为指针类型
    p4->play();
    return 0;
}

执行结果:

play
play phone
play
play phone
play phone

play phone

你可能感兴趣的:(编程)