码迷,mamicode.com
首页 > 其他好文 > 详细

私有虚函数

时间:2018-05-18 22:27:03      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:派生   成员   细节   父类   int   方式   作用   ace   常见   

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

私有虚函数

标签:派生   成员   细节   父类   int   方式   作用   ace   常见   

原文地址:https://www.cnblogs.com/guoyu1024/p/9058099.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!