私有函数被调用,它的工作原理。请问你们有什么理由吗?

时间:2014-01-03 13:53:56

标签: c++

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

#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打印

2 个答案:

答案 0 :(得分:7)

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

  

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

     

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

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

答案 1 :(得分:6)

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