多态性之超载与虚函数

news/2024/7/3 12:25:07 标签: 多态, 面向对象编程, 超载, 虚函数

面向对象编程object-oriented-programmingoop面向对象程序设计有三个重要特征封装性继承性和多态性">面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)有三个重要特征:封装性、继承性和多态性。

多态性">多态

多态性">不同的对象接收到同样的指令(调用同一函数)会产生不一样的结果,谓之多态

多态性让程序生动而有魅力">举个简单的例子,【动物类】派生出【猫类】和【狗类】。【猫类】对象和【狗类】对象调用同一函数【叫】时,前者产生“喵~~”,而后者产生“汪汪汪”。这就是多态,让程序生动而有魅力

函数重载与静态联编

多个函数使用同一函数名,但这些同名函数具有不同的原型(形参表不同),这就是函数重载

因为重载函数的形参表是不同的,因此系统在编译过程中就可以确定该函数与程序中的哪一段函数相联系,即在编译时就已确定函数调用语句对应的函数体代码,故称为静态联编


超载与动态联编">函数超载与动态联编

超载">多个函数,有完全相同的函数原型,却可以不同的函数体,这种现象就叫函数超载

超载函数允许不同的函数具有相同的函数原型因此在编译阶段系统无法判断此次调用应执行哪一段函数代码只有在运行过程中执行到该函数调用时才能临时判断应执行哪一段函数代码故称为动态联编">由于超载函数允许不同的函数具有相同的函数原型,因此在编译阶段系统无法判断此次调用应执行哪一段函数代码。只有在运行过程中执行到该函数调用时,才能临时判断应执行哪一段函数代码,故称为动态联编

虚函数与动态联编我们需要用到一个概念那就是虚函数">为了实现虚函数与动态联编,我们需要用到一个概念,那就是虚函数


虚函数">虚函数

虚函数">在基类中将某一非静态成员函数的属性说明为virtual,则称该函数为虚函数

格式

virtual <返回类型><函数名>(<参数表>){
    // 函数体
}

说明方法

虚函数其派生类中也列出与该函数原型相同但函数体可以不同的函数成员">基类中某函数被说明为虚函数,其派生类中也列出与该函数原型相同但函数体可以不同的函数成员。

示例

class Animal{
    virtual void sound(){ sound.. }
};
class Cat{
    virtual void sound(){ Meow~~~ }
};
class Dog{
    virtual void sound(){ Bark!!! }
};
class Bird{
    virtual void sound(){ Tweet^^^ }
};

注意

虚函数中做任何的事情可用如下格式将该函数说明为纯虚函数详见-纯虚函数与抽象基类">1.如果不准备在基类的虚函数中做任何的事情,可用如下格式将该函数说明为纯虚函数。(详见 纯虚函数与抽象基类)

virtual <函数原型>=0;

虚函数但在基类中不可缺省">2.在派生类说明中关键字“virtual”可以缺省,它们自动定义为虚函数,但在基类中不可缺省。

虚函数但析构函数可以说明为虚函数">3.构造函数不能说明为虚函数,但析构函数可以说明为虚函数

使用方法

虚函数">1.直接通过派生类对象调用它们各自实现的虚函数

Cat cat;        cat.sound();
Dog dog;        dog.sound();
Bird bird;      bird.sound();

虚函数">2.使用指向基类的指针,然后再通过将派生类对象的地址赋给基类指针变量,从而通过指针间接调用派生类各自实现的虚函数

Cat cat;
Dog dog;
Bird bird;
Animal *pa;
pa = &cat;      pa->sound();
pa = &dog;      pa->sound();
pa = &bird;     pa->sound();

虚函数的好处">虚函数的好处

1.使程序简单易读,减少限定符的使用。

2.使程序模块间独立性加强,隐藏函数细节,提高程序封装性。

3.增加程序易维护性,新增派生类更容易。


http://www.niftyadmin.cn/n/1186751.html

相关文章

纯虚函数与抽象基类

纯虚函数 如果不准备在基类的虚函数中做任何的事情&#xff0c;可用如下格式将该函数说明为纯虚函数。 virtual <函数原型>0; 纯虚函数只为其派生类的各虚函数规定了一个一致的函数原型&#xff0c;具体的虚函数实现在其派生类中给出。 抽象基类 含有纯虚函数的基类…

查看运行结果

看下列代码的运行结果 #include "pch.h" #include<iostream> using namespace std;class A { public:A(){a 1;b 2;} private:int a;int b; }; class B { public:B(){c 3;}void print(){cout << c;} private:int c; }; int main(int argc, char* argv…

函数模板的说明

格式 template <<模板参数表>> <返回类型> <函数名> (<参数表>){<函数体> }; 模板参数表&#xff1a;用尖括号括起来&#xff0c;可包含一个或多个模板参数&#xff0c;用逗号分开。 模板参数格式 class<参数名> 例子 templat…

vector的几种初始化及赋值方式

转自&#xff1a;https://blog.csdn.net/yjunyu/article/details/77728410?locationNum10&fps1 vector的几种初始化及赋值方式&#xff1a; &#xff08;1&#xff09;不带参数的构造函数初始化 //初始化一个size为0的vector vector<int> abc; &#xff08;2&…

类模板的说明

说明格式 template <<模板参数表>> class <类模板名>{<类模板定义体> }; 模板参数表&#xff1a;用尖括号括起来&#xff0c;可包含一个或多个模板参数&#xff0c;用逗号分开。 模板参数格式 1.类型形参 class<参数名>// 如&#xff1a;cl…

类模板的静态成员

类模板也允许有静态成员。 实际上&#xff0c;它们是类模板之实例化类的静态成员。 也就是说&#xff0c;对于一个类模板的每一个实例化类&#xff0c;其所有的对象共享其静态成员。例如&#xff1a; template <class T> class TestClass{static T data;// 类模板的静…