调用私有函数并且它有效.请你们中的任何人推理一下

Private function invoked and it works. Could any of you reason it please

本文关键字:推理 任何人 一下 函数 请你 有效 调用      更新时间:2023-10-16

我可以调用派生类的私有函数。可以吗?

#include <iostream>
class A {
public:
    virtual ~A() {}
    virtual void func()
    {
        std::cout << " Printing from A" << std::endl;
    }
};
class B : public A {
private:
    virtual void func()
    {
        std::cout<< " Printing from B"<<std::endl;
    }
};
main()
{
    B b;
    A* a = &b;
    a->func();
    // b.func(); Not possible as expected.
}

下面是输出

从 B 打印

对虚函数的访问由其在对象的静态类型中的声明确定,而不是由动态类型中重写函数的声明确定。

§11.5 [class.access.virt] 虚函数的访问规则(条款 11)由其声明确定,不受稍后覆盖它的函数的规则的影响。

使用用于表示调用成员函数的对象的表达式的类型在调用点检查访问。成员函数在定义它的类中的访问通常是未知的。

由于A::funcpublic的,通过指向A的指针多态地调用B::func是可以的。

访问说明符是在进行调用的对象、指针或引用的静态类型级别检查的,即使调用被调度到所指向/引用的对象的动态类型也是如此。在您的情况下,a->func()是通过 A* 类型的指针调用的,因此在A级别检查访问说明符,其中func()是公共的。