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();
    }

    运行结果

    现象

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

    结论

    • 当通过基类的对象直接调用虚函数时,总是调用该对象所属的函数。所以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();
    }

    结果

    总结

    定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数
    语法:virtual 函数返回类型 函数名(参数表) {函数体;}
    用途实现多态性,通过指向派生类基类指针,访问派生类中同名覆盖成员函数
  • 相关阅读:
    MongoDB学习
    Linux 硬盘分区、分区、删除分区、格式化、挂载、卸载
    openstack中数据库连接数太多--pymysql.err.OperationalError,1040, u'Too many connections'
    openstack各服务端口使用情况
    linux常用命令
    云计算---OpenStack Neutron详解
    shell---数据流重定向
    云计算---openstack创建虚拟机过程
    SpringMvc面试题
    Linux 本机/异机文件对比
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3306409.html
Copyright © 2011-2022 走看看