从Base类对象调用私有虚函数

时间:2015-08-12 00:13:55

标签: c++ virtual private

我已经了解到最好将虚拟函数保密,但在我下面发布的代码中,除非友谊可以继承,否则函数call_inside()不应该能够调用D1类中定义的虚函数。所以我想知道它是如何运作的。

感谢您的回复。

#include<iostream>
struct B
{
friend void call_inside();
private:
  virtual void fun()  {std::cout<<"virtual_B"<<std::endl;}
};
struct D1:public B
{
private:
  void fun()override  {std::cout<<"virtual_D1"<<std::endl;}
};
void call_inside()
{
  B trial; D1 trial1;
  B *p=&trial, *p1=&trial1;
  p->fun();
  p1->fun();
}
int main()
{
  call_inside();
  return 0;
}

1 个答案:

答案 0 :(得分:1)

call_inside函数是B的朋友。在call_inside范围内,您通过指向fun实例的指针两次调用B。其中一个B指针实际指向D的事实并不重要,因为用于调用函数的指针类型为B。如果您改为在trial1.fun()中致电call_inside,则由于fun private DD并且您尝试调用它,您将收到预期的编译错误通过angular.module('batchUploadApp').service('ExcelParserService', ... 实例。