zoukankan      html  css  js  c++  java
  • c++ --> 虚函数

    虚函数

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Base
    {
        public:
            virtual void print_val()
            {
                cout << "base" << endl;
            }
    };
    class Derived : public Base
    {
        public:
            void print_val()
            {
                cout << "Derived" << endl;
            }
    };
    
    int main()
    {
        Derived d;
        Base ob(d);
        Base *pb = &d;
        Base &yb = d;
        ob.print_val();
        pb->print_val();
        yb.print_val();
    }

    运行结果:

    base
    Derived
    Derived

    现象

    程序用了三种方式来测试虚函数的调用:基类对象、基类指针、基类引用。由结果可以看出,当用引用、指针调用虚函数是调用的是派生类的实际函数,而不是基类的虚函数。

    结论

    • 当通过基类的对象直接调用虚函数时,总是调用该对象所属的函数。所以ob是基类的对象,调用的是基类的实例
    • 当使用指向基类的指针或引用调用时,将动态绑定虚函数,即调用该指针或引用所指的类型定义的函数。pb是指向基类对象的指针,但是实际指向的是派生类对象,所以调用派生类的实例

    对比

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Base
    {
        public:
            void print_val()
            {
                cout << "base" << endl;
            }
    };
    class Derived : public Base
    {
        public:
            void print_val()
            {
                cout << "Derived" << endl;
            }
    };
    
    int main()
    {
        Derived d;
        Base ob(d);
        Base *pb = &d;
        Base &yb = d;
        ob.print_val();
        pb->print_val();
        yb.print_val();
    }

    结果:

    base
    base
    base

    总结

    定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数
    语法:virtual 函数返回类型 函数名(参数表) {函数体;}
    用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数
  • 相关阅读:
    linux常用命令
    windows 安装elasticsearch-head插件
    spring boot 使用logback日志系统的详细说明
    mysql 修改密码的几种方式
    html跑马灯效果
    windows 安装elk日志系统
    logstash 启动报找不主类或无法加载 java
    MySQL和Postgresql的区别
    Swift-----泛型Generic
    Swift-----扩展extension
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4598731.html
Copyright © 2011-2022 走看看