• 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 函数返回类型 函数名(参数表) {函数体;}
    用途实现多态性,通过指向派生类基类指针,访问派生类中同名覆盖成员函数
  • 相关阅读:
    [翻译]理解offsetWidth,clientWidth,scrollWidth以及Height
    [翻译]Chrome控制台API参考
    前端最新面试题
    前端面试题HTML+CSS
    css代码优化的12个技巧
    重构、标准、布局
    跨域的场景及跨域方式
    ajax
    那些我们该知道的数组操作
    全国最新行政区划省市区三级数据表(2018年9月),可直接用Python处理后导入数据库
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3306409.html
Copyright © 2020-2023  润新知