zoukankan      html  css  js  c++  java
  • 私有虚函数

    #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,表示基类想让这个函数实现多态。意思是,派生类既可以修改这个实现,也可以继承其默认的实现。所以,基类中有一个虚拟私有成员函数,表示这是一个可以被派生类修改的实现细节。

  • 相关阅读:
    Elasticsearch源码加载到eclipse调试
    Elasticsearch基础教程
    关于JAVA EE项目在WEB-INF目录下的jsp页面如何访问WebRoot中的CSS和JS文件
    访问WEB-INF下的JSP (转载)
    SqlServer的代理问题
    SqlServer进行程序跟踪
    git简单的修改
    Linux部署项目
    网址仓库
    Linux基础
  • 原文地址:https://www.cnblogs.com/guoyu1024/p/9058099.html
Copyright © 2011-2022 走看看