私有虚函数

Posted 水果无味~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了私有虚函数相关的知识,希望对你有一定的参考价值。

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

以上是关于私有虚函数的主要内容,如果未能解决你的问题,请参考以下文章

C ++:私有虚函数与纯虚函数[重复]

C++ 为啥我可以从派生类调用基类的私有虚函数?

私有虚函数

在片段的私有函数中使用 adapterPosition

c++中的纯虚函数机制如何从DLL中暴露函数

定义一个复数类Complex,它有2个私有数据成员:m_real(描述实部),m_image(描述虚部)和若干个公有成员