• c++,虚函数


    1.在声明函数时,在最前加上virtual,则该函数就是函虚数,基类的虚函数被派生类继承后仍是虚函数。
    2.派生类中可以重写基类的虚函数。
    3.用指针访问重写的虚函数时,被访问的虚函数是指针指向的对象所属类的函数(只看指向的对象所属的类)。

    而用指针访问重写的普通函数时,被访问的函数是指针类型所属类的函数(只看指针是什么类) 

    4.(引用和指针相同)

    5. 虚函数的使用:静态关联和动态关联。

      有的虚函数在编译时能确定它属于哪个类,这属于静态关联。如:通过对象名调用的虚函数。

      有的时候虚函数的应用则可以实现动态关联,如:下面的代码中实现的多态功能,传入不同类的指针,执行不同类中的函数。



    #include <iostream> using namespace std; //////////////////////////// class Base { public: void show1(); virtual void show2(); }; void Base::show1() { cout << "Base::show1()...." << endl; } void Base::show2() { cout << "Base::show2()...." << endl; } //////////////////////////// class Child: public Base { public: void show1(); virtual void show2(); //感觉如果show2在其父类已经声明为virtual,这里virtual可以不要。即便接着向下派生,这个virtual写不写都能正确调用下级派生类。 }; //基类的虚函数被派生类继承后仍是虚函数。
    void Child::show1() {
        cout<<"Child::show1()
    ";
    }
    void Child::show2() {
        cout<<"Child::show2()...
    ";
    }
    
    class Child2: public Child {
    public:
        void show1();
        void show2(); 
    };
    void Child2::show1() {
        cout<<"Child2::show1()
    ";
    }
    void Child2::show2() {
        cout<<"Child2::show2()...
    ";
    }
    
    //////////////////////////// 
    
    class Test :public Base{
    public:
        virtual void show2(); // 感觉这个virtual可以不要。
    }; void Test::show2() { cout<<"Test::show2().."<<endl; } //////////////////////////// void f1(Base *p) { p->show1(); //指针的指向就是Base::show1() //用指针访问重写的普通函数时,被访问的函数是参数列表所声明的类的函数。 } void f2(Base *p) { //用指针访问重写的虚函数时,被访问的虚函数是指针指向的对象所属类的函数。 p->show2(); } void f3(Child *p) { p->show2(); } ////////////////////////////// int main() { Child child; Base base; Test test; Child2 child2 ; //再下级的派生类 f1(&base); //Base::show1()....对于普通函数:被访问的函数是参数列表所声明的类的函数 f1(&child); //Base::show1().... f1(&test); //Base::show1()... f1(&child2); //Base::show1()... f2(&child); //Child::show2()...//用指针访问重写的虚函数时,被访问的虚函数是指针指向的对象所属类的函数 f2(&base); //Base::show2()....//这就是虚函数的意义:函数体一样,却能传入不同的函数指针执行各自的功能 f2(&test); //Test::show2().. f2(&child2); //Child2::show2().. //Child { void show2() ;} 要不要virtual效果一样 f3(&child2); while(1); return 0; }
  • 相关阅读:
    Kafka 高级API 实战
    CDH 5.16.1 离线安装 Spark 2.3
    CDH5.16.1 离线安装 Kafka
    CDH5.16.1新增节点
    mysql搭建主从结构
    Kerberos常见错误
    expect实现脚本的 自动交互
    寒假day27
    寒假day26
    寒假day25
  • 原文地址:https://www.cnblogs.com/mylinux/p/4095280.html
Copyright © 2020-2023  润新知