虚拟功能打破私人访问

use*_*367 2 c++ virtual

我最近在IBM网站看过这篇文章.下面是示例代码

#include "iostream"

class B {
public:
  virtual void f()
  {
    std::cout<<"\n In class B";
  }
};

class D : public B {
private:
    int i;

  void f()
  {
  std::cout<<"\n In class D i = "<<i;
  }
  public:
    D(int i_num):i(i_num)
    {}
};

int main() {
  D dobj(10);
  B* bptr = &dobj;
  D* dptr = &dobj;

  // valid, virtual B::f() is public,
  // D::f() is called
  bptr->f();

  // error, D::f() is private
  //dptr->f();
}
Run Code Online (Sandbox Code Playgroud)

我们现在能够调用DI的私有函数想知道这不会破解C++封装吗?

PS:请转到虚拟功能中的虚拟功能访问部分.我不知道为什么我粘贴时没有得到确切的链接.

Alo*_*ave 6

bptr->f()在运行时评估调用,具体取决于指向的对象类型bptr.在编译时编译看到bptr->f()电话呼叫到B::f(),自B::f()public编译器不报告唯一的错误.只有在运行时D::f()才会评估实际的函数调用.

这并没有打破这个Encapsulation原则,这是C++的一个特性叫做Run-time PolymorphismDynamic Polymorphism

您不能直接调用dptr->f()因为D::f()PrivateAccess说明符下声明,并且您无法从类外部访问私有声明的成员.