浏览器标题切换
浏览器标题切换end

C++ - 虚函数

虚函数使用

虚函数:在基类中加了 virtual 关键字的函数就是虚函数。

虚函数原理

虚函数实现原理:虚函数表和虚函数指针。

虚函数和纯虚函数的区别

  1. 定义一个函数为虚函数,不代表函数为不被实现的函数;定义一个函数为纯虚函数,才代表函数没有被实现。

  2. 定义为虚函数的目的:为了允许用基类的指针来调用子类的这个函数。

  3. 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。

具体实现代码

理解过程在下面代码注释中:

#include<iostream>
using namespace std;

//基类People
class People
{
public:
    virtual void a(float x)
    {cout<<"People::a "<<x<<endl;}

    void b(float x)
    {cout<<"People::b "<<x<<endl;}

    void c(float x)
    {cout<<"People::c "<<x<<endl;}
};

//派生类Student
class Student:public People
{
public:
    virtual void a(float x)
    {cout<<"Student::a "<<x<<endl;}

    void b(int x)
    {cout<<"Student::b "<<x<<endl;}

    void c(float x)
    {cout<<"Student::c "<<x<<endl;}
};

// 只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用
int main()
{
    Student d;

    People *people=&d; // p基类指针,p的函数调用如果有virtual
    // 如果没有virtual,是正常的静态函数调用-调用基类的:输出 Peoplexxxx
    // 如果有virtual,根据多态性调用派生类的:调用a函数输出 Student xxx

    Student *student=&d;
    // student派生类指针,s的所有函数调用都只是调用自己的函数,和多态性无关,student的所有函数调用的结果都输出Student::是正常的

    people->a(1.45f); // Student::a 1.45   atttention!
    student->a(1.45f); // Student::a 1.45

    people->b(1.45f); // People::b 1.45
    student->b(1.45f); // Student::b 1

    people->c(1.45f); // People::c 1.45   atttention!
    student->c(1.45f); // Student::c 1.45

    return 0;
}
posted @   抓水母的派大星  阅读(98)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2020-03-15 寒假Day51:Codeforces520B-Two Buttons-思维/bfs
点击右上角即可分享
微信分享提示