• 【C++精简版回顾】16.虚函数,多态


    1.虚函数与多态

    以下为AI生成

            虚函数是C++中实现多态性的一种机制。多态性允许一个类的对象可以以多种不同的方式工作,即同一个函数可以根据对象的不同类型表现出不同的行为

            在C++中,通过在基类中声明虚函数,并在派生类中进行重写,可以实现多态性。当通过基类指针或引用调用虚函数时,会根据指针或引用所指向的对象的实际类型来确定调用哪个类的虚函数。

    以下是虚函数与多态的一些关键点:

    1. 虚函数:在基类中使用virtual关键字声明的成员函数被称为虚函数。派生类可以对虚函数进行重写,实现自己的版本。
    2. 动态绑定:通过基类指针或引用调用虚函数时,会根据指针或引用所指向的对象的实际类型来确定调用哪个类的虚函数。这种在运行时确定函数调用的机制称为动态绑定。
    3. 纯虚函数:在基类中使用virtual关键字声明且没有实现的函数被称为纯虚函数。纯虚函数必须在派生类中进行重写才能创建对象。
    4. 虚析构函数:当基类指针指向派生类对象并通过该指针删除对象时,如果基类的析构函数不是虚函数,将只会调用基类的析构函数,而不会调用派生类的析构函数。为了确保正确释放派生类对象的资源,需要将基类的析构函数声明为虚函数。

    虚函数函数与多态 

            对于我来说,虚函数就是函数前面加virtual,多态就是子类重写父类虚函数。

    1.class People

    1. class People {
    2. public:
    3. static int a;
    4. People() {}
    5. virtual void print() {
    6. cout<<"调用People的函数" << endl;
    7. }
    8. };
    9. int People::a = 1;

    2.class MM

    1. class MM :public People {
    2. public:
    3. MM() {}
    4. MM(int age,string name):age(age),name(name) {}
    5. void print() {
    6. cout << "调用MM的函数" << endl;
    7. //说明static变量也可以继承
    8. cout << "静态变量:"<<a<< endl;
    9. }
    10. private:
    11. int age;
    12. string name;
    13. };

    3.main

    1. int main() {
    2. MM mm(10,"网");
    3. mm.print();
    4. return 0;
    5. }

    结果:

    2.抽象类,纯虚函数

            纯虚函数:virtual void print()=0; 注意后面要等于0

            抽象类:类中全为纯虚函数

            你是公司的底层程序员,那么就是你继承抽象类然后实现。。牛马的一生。

    1.class People

    1. class People {//抽象类
    2. public:
    3. virtual void print() = 0;
    4. virtual void print1() = 0;//纯虚函数
    5. };

    2.class MM

    1. class MM :public People{
    2. public:
    3. void print() {
    4. cout<<"调用print函数" << endl;
    5. }
    6. void print1() {
    7. cout << "调用print1函数" << endl;
    8. }
    9. ~MM() {
    10. cout << "调用MM析构函数" << endl;
    11. }
    12. };

    3.main

    1. int main() {
    2. MM mm;
    3. mm.print();
    4. mm.print1();
    5. return 0;
    6. }

    结果:

    补充:使用new创建

    1.new创建不delete

            结果:不调用析构函数


    2.new创建delete

            结果:调用析构函数

    3.虚析构函数

    1.class People

    1. class People {//抽象类
    2. public:
    3. ~People() {
    4. cout << "调用People析构函数" << endl;
    5. }
    6. virtual void print() = 0;//纯虚函数
    7. };

    2.class MM:public People

    1. class MM :public People{
    2. public:
    3. MM() {}
    4. ~MM() {
    5. cout << "调用MM析构函数" << endl;
    6. }
    7. void print() {}
    8. };

    3.main

    (1)MM* mm=new MM;

    1. int main() {
    2. MM* mm=new MM;
    3. //释放
    4. delete mm;
    5. mm = nullptr;
    6. return 0;
    7. }

    (2)People* mm=new MM;这是多态的写法,基类指针指向派生类对象并通过该指针删除对象时,如果基类的析构函数不是虚函数,将只会调用基类的析构函数,而不会调用派生类的析构函数。

            显然有错,使用MM(子类)来创建People(父类)对象,在析构的时候没有析构子类,解决方法是使用virtual修饰People(父类)的析构函数。如(3)

    1. int main() {
    2. People* mm=new MM;
    3. //释放
    4. delete mm;
    5. mm = nullptr;
    6. return 0;
    7. }

    (2)People* mm=new MM;

    1. int main() {
    2. People* mm=new MM;
    3. //释放
    4. delete mm;
    5. mm = nullptr;
    6. return 0;
    7. }

  • 相关阅读:
    JavaWeb笔记(五)后端
    XFF漏洞利用([SWPUCTF 2021 新赛]Do_you_know_http)
    【经济研究】数字技术创新与中国企业高质量发展—来自企业数字专利的证据
    CSS动画 animation VS transition
    简易备忘录
    变种水仙花C,超详细思路+源代码
    构造方法引用
    打开记事本
    世界前沿技术发展报告2023《世界航空技术发展报告》(四)无人机技术
    Linux 常用命令
  • 原文地址:https://blog.csdn.net/m0_61659911/article/details/136411997