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 函数返回类型 函数名(参数表) {函数体;}
    用途实现多态性,通过指向派生类基类指针,访问派生类中同名覆盖成员函数
  • 相关阅读:
    java1234初学maven
    解决maven创建web项目卡死在generator插件(转)
    maven下载速度慢的解决方法(转)
    git分支
    git基础
    oracle分析函数与over()(转)
    Oracle开窗函数 over()(转)
    Oracle计算时间函数(对时间的加减numtodsinterval、numtoyminterval) (转)
    selenium使用中遇到的问题
    selenium运行火狐报错FirefoxDriver : Unable to connect to host 127.0.0.1 on port 7055
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3306409.html
Copyright © 2011-2022 走看看