C++ 类的多态二(函数重载--函数重写--函数重定义)

//函数重载--函数重写--函数重定义
#include<iostream>
using namespace std;

/*
函数重载:
必须在一个类中进行(子类无法重载父类中的函数)
子类无法重载父类的函数,父类同名函数将被子类的同名函数覆盖
重载是在编译期间根据参数类型,顺序,个数决定的函数调用

函数重写
必须发生于父类和子类之间
并且父类和子类中的函数必须有完全相同的函数签名
使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
多态是在运行期间根据具体对象的类型决定函数调用
重写的同时一般会伴随发生函数重定义

函数重定义
必须发生于父类和子类之间
并且父类和子类中有完全相同的函数名(但是参数列表 返回值可以不同,只要求函数名相同)
重定义不一定是多态

重写--重载都是c++的概念
*/

class Point{
public:
    //函数重载

    void Fuc(){
        cout << "1 父类重载函数" << endl;
    }

    int Fuc(int a){
        cout << "2 父类重载函数" << endl;
        return a;
    }

    virtual void Fuc(int i, int j){
        cout << "3 父类重载虚函数" << endl;
    }

    virtual void Fuc(int i, int j,int k){
        cout << "4 父类重载虚函数" << endl;
    }
};

class PointA :public Point{
public:
    //重写父类函数3---在重写父类函数的同时,同时也对父类同名函数进行了重定义,所以通过子类对象无法再调用父类同名函数
    void Fuc(int i,int j){
        cout << "1 子类重写虚函数" << endl;
    }
    //重定义父类函数
    int Fuc(int a){
        cout << "2 子类重载函数" << endl;
        return a;
    }
};

void ProtectA(Point &pin){
    pin.Fuc(1);
}

void ProtectB(){
    PointA pa;
    ProtectA(pa);
    //pa.Fuc();   报错 error C2661 : “PointA::Fuc” : 没有重载函数接受 0 个参数
    //由此证明:函数重写时,发生了函数重定义(此时子类里并没有 int Fuc(int a)这个函数)
}

void main(){
    ProtectB();
    system("pause");
}
时间: 2024-10-02 14:26:40

C++ 类的多态二(函数重载--函数重写--函数重定义)的相关文章

C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义

首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象. 虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体差异而采用不同的策略.纯虚函数则是一种特殊的虚函数.虚函数联系到多态,多态联系到继承. 一.虚函

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

1.重载:重载是在一个类中,函数名一样,参数类型或参数个数不同的一系列函数需要注意的是,与返回类型无关. class Test { public: void show(); void show(int a); void show(double a); void show(int a,int b); void show(int a,double b); }; 2.重写我们比较熟悉的另一个词是“覆盖”用在继承中,子类若没有重新定义父类的虚方法,则子类对象调用该方法时,使用的仍是父类的方法:否则,子类

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

一.重载(overload)指函数名相同,但是它的参数表列个数或顺序,类型不同.但是不能靠返回类型来判断.(1)相同的范围(在同一个作用域中) :(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.(5)返回值可以不同: 二.重写(也称为覆盖 override)是指派生类重新定义基类的虚函数,特征是:(1)不在同一个作用域(分别位于派生类与基类) :(2)函数名字相同:(3)参数相同:(4)基类函数必须有 virtual 关键字,不能有 static .(5)返回值相同(或

C++中重载、重写和重定义的区别

参考博客:http://blog.sina.com.cn/s/blog_8ddc5c2e01013hbd.html 相信看到这个标题头就晕了,其实将他们彼此放到一起来看,就会比较清晰辨认了. 重载:函数名相同,函数的参数个数.参数类型或参数顺序三者中必须至少有一种不同.函数返回值的类型可以相同,也可以不相同. 重写:也叫做覆盖,一般发生在子类和父类继承关系之间.子类重新定义父类中有相同名称和参数的虚函数. 重定义:也叫做隐藏,子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) ,指

c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)

重载,隐藏(重定义),覆盖(重写)-这几个名词看着好像很像,不过其实一样都不一样!! 综述: 一.重载: (1)概念:在同一个作用域内:函数名相同,参数列表不同(参数个数不同,或者参数类型不同,或者参数个数和参数类型都不同),返回值类型可相同也可不同:这种情况叫做c++的重载! (2)举例: #include "stdafx.h" #include<iostream> using namespace std; int Add(int a, int b) { return a

C++的函数重载和main函数之外的工作

今天被问到一个C++的函数重载问题,一下子没反应过来,这种基础的问题竟然忘记了,以下记录一下这些忘记的内容.     函数重载 函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载.注意函数重载不能基于不同的返回值类型进行重载. 注意函数重载中的"形参表"不同,是指本质不同,不要被一些表象迷惑.main函数不能被重载. 下面三组定义本质是相同的,不是重载: 1)int sum (int &a); 和 int sum (int &)

重写,重定义,重载

> 重写,重定义经常与继承和虚继承一起使用,那么我们一步一步来,先看看重写,重定义到底是什么样子的呢? >重载: 1.它在同一个作用域中 2.函数名必须相同 3.参数个数,类型,顺序不同 4.返回值不作要求 5.virtual关键字不作要求 >重写(覆盖): 1.不在同一个作用域中(即基类与子类中) 2.函数名相同,返回值相同,参数也相同 3.只是在基类同名函数前必须有virtual关键字不能有static. 这时派生类的重写函数就会覆盖基类中的同名函数. >重定义(隐藏): 1.

java 类构造函数,属性、函数重载、Static ,包的定义及使用

1.类的构造函数:      类的构造函数教学视频     总结:           a)         无参构造函数          b)         有参构造函数          c)         构造函数的重载           结论:如果没有定义构造函数,则系统会生成一个无参构造函数,如果用户定义了构造函数,则系统就不再生成无参构造函数. 2.类的属性总结:     类的属性使用教学视频  属性通常定义为private成员. 为每一个成员定义getter and set

【C++】多态性(函数重载与虚函数)

多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. 运行时多态性:不同对象在收到相同消息时产生不同的动作,一般通过虚函数来实现,只有在运行时才能实现绑定,属于动态绑定. 虚函数 虚函数是在基类中用关键字virtual 标识的成员函数,可以在一个或多个派生类中被重新定义.如果一个函数被定义为虚函数,那么,即使是使用指向基类对象的指针来调用该成员函数,也