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 函数返回类型 函数名(参数表) {函数体;}
    用途实现多态性,通过指向派生类基类指针,访问派生类中同名覆盖成员函数
  • 相关阅读:
    APP测试之找密码
    测试理论
    LR性能测试
    Linux 操作系统常用命令
    C#后台HttpWebRequest代码调用WebService
    Python3在Windows下安装虚拟环境
    oracle使用rownum进行分页查询
    oracle over结合row_number分区进行数据去重处理
    Oracle实现主键自动增长
    Asp.net WebApi调用
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3306409.html
Copyright © 2011-2022 走看看