• 私有虚函数


    #include<iostream>
    using namespace std;
    class base
    {
    private:
        virtual void func(){cout<<"base : func()"<<endl;}
    };
    class derived :public base
    {
    public:
        virtual void func(){cout<<"derived :func()"<<endl;}
    };
    int main()
    {
        derived d;
        base *pbase=&d;
        pbase->func();
        return 0;
    }

    编译出错的原因是,func 是 base 的私有成员。即使运行到此时实际上调用的应该是 derived 的共有成员 func() 也不行,因为语法检查是不考虑运行结果

    如果将 base 中的private 换成 public ,即使 derived 中的func () 是private 的,编译依然能通过,也能正确调用 derived ::func(), 派生类的虚函数的访问权限不影响虚函数的动态联编,也就是多态与成员函数的访问权限并没有什么关系。基类定义了虚函数,并且是 public ,那么派生类只要 override 虚函数无论放在什么样的访问权限下,都以基类的访问权限为主。

    2 非共有虚函数

       派生类通过覆盖基类共有虚函数的方式实现多态是最常见的情况,指向派生类对象的基类指针调用被派生类覆盖的函数,实际上是调用的是派生类的函数

      从表面上看,虚函数的作用就是为了使父类指针能够访问到派生类对象的函数。通过基类指针或引用调用成员函数时,不论成员函数的可见性如何,如果该函数是非虚拟的,那么将采用静态绑定,即编译时绑定;如果该函数是虚拟的 则采用动态绑定,即运行时绑定。

    #include<iostream>
    using namespace std;
    class base
    {
    private:
        virtual void func2(){cout<<"base : func2()"<<endl;}
    public:
        void func1()
        {
            func2();
        }
    };
    class derived :public base
    {
    private:
        virtual void func2(){cout<<"derived :func2()"<<endl;}
    };
    int main()
    {
         base *p=new derived();
         p->func1();
         delete p;
        return 0;
    }

    上述例子中,基类func2 被声明为virtue private,声明为private 表示基类不想让派生类看到这个函数,但又声明为virtue,表示基类想让这个函数实现多态。意思是,派生类既可以修改这个实现,也可以继承其默认的实现。所以,基类中有一个虚拟私有成员函数,表示这是一个可以被派生类修改的实现细节。

  • 相关阅读:
    从零开始山寨Caffe·拾:IO系统(三)
    从零开始山寨Caffe·玖:BlobFlow
    从零开始山寨Caffe·捌:IO系统(二)
    从零开始山寨Caffe·柒:KV数据库
    从零开始山寨Caffe·陆:IO系统(一)
    从零开始山寨Caffe·伍:Protocol Buffer简易指南
    js实现hash
    编程词汇
    开发技术文档汇总
    前端开发者进阶之函数反柯里化unCurrying
  • 原文地址:https://www.cnblogs.com/guoyu1024/p/9058099.html
Copyright © 2020-2023  润新知