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

Call private virtual functions from Base class object

我学习到虚函数最好是私有的,但是在我下面贴出的代码中,除非友情可以继承,函数call_inside()应该是不能调用定义的虚函数的D1 class。所以我想知道它是如何工作的。

感谢您的回复。

#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;
}

call_inside 函数是 B 的好友。在 call_inside 中,您调用了 fun 两次,两次都是通过指向 B 实例的指针。 B 指针之一实际指向 D 这一事实并不重要,因为用于调用该函数的指针类型是 B。如果您改为在 call_inside 中调用 trial1.fun(),您将收到预期的编译错误,因为 funD 上是 private 并且您尝试调用它通过 D 个实例。