c++ - 从基类对象调用私有(private)虚函数

标签 c++ virtual private

我了解到最好将虚函数保持私有(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;
}

最佳答案

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

关于c++ - 从基类对象调用私有(private)虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954049/

相关文章:

c++ - 无效句柄异常

Swift:私有(private)常量与常量类型属性

用于私有(private)/ protected 方法的 JavaDoc?

java - 在 Java 中传递私有(private)字符串

c++ - 使用 std::thread 暂停/恢复异步进程

c++ - 为什么我在使用 VK_PRESENT_MODE_FIFO_KHR 呈现模式调整交换链图像大小时出现白色闪烁?

c++ - 什么时候是一个对象 "out of scope"?

keyboard - 如何在没有表单标签的情况下更改 Mobile Safari 键盘中的返回键文本?

java - 编写新的 JVM 是否合法?

c++ - 编译器构造虚表