我可以调用派生类的私有函数。这好吗?
#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打印
答案 0 :(得分:7)
对虚函数的访问由其在对象的静态类型中的声明决定,而不是由动态类型中覆盖函数的声明决定。
§11.5[class.access.virt] 虚函数的访问规则(第11条)由其声明确定,不受稍后覆盖它的函数规则的影响。
使用用于表示调用成员函数的对象的表达式类型在调用点检查访问。成员函数在定义它的类中的访问通常是未知的。
由于A::func
为public
,通过指向B::func
的指针多态调用A
就可以了。
答案 1 :(得分:6)
在调用所针对的对象,指针或引用的静态类型级别检查访问说明符,即使调用被调度到指向/引用的对象的动态类型也是如此。在您的情况下,通过a->func()
类型的指针调用A*
,因此在A
级别检查访问说明符,其中func()
是公开的。