首页 > 解决方案 > 为什么我可以从子类中调用私有函数

问题描述

我把一个班级放到另一个班级。我将最高级别的类的引用放入较低级别的类(不确定是否有这个的命名法......不是孩子/父母......?子类?)。我很惊讶地看到我可以从那个子类中调用私有函数。为什么这可能?

简单示例:我很惊讶 Bar 可以从 Foo 调用私有函数

// Example program
#include <iostream>
#include <string>

class Foo {
    public:
        class Bar {
            public:
                Bar(Foo &foo);
                void DoFoo();
            private:
                Foo &foo;
        };

        Foo();
    private:
        void Do();
};

Foo::Foo(){}
void Foo::Do(){
    std::cout << "im doing foo";   
}
Foo::Bar::Bar(Foo &foo)
:foo(foo)
{

};
void Foo::Bar::DoFoo(){
    this->foo.Do();
}

int main()
{
    Foo foo;
    Foo::Bar bar(foo);
    bar.DoFoo();
}

标签: c++

解决方案


实际上访问限制在这里并不重要,因为(来自cppreference,强调我的)......

一个类的所有成员(成员函数体、成员对象的初始化器和整个嵌套类定义)都可以访问该类可以访问的所有名称。

在您的示例Bar中是一个嵌套类,它可以访问所有成员Foo(与它们是否被声明无关private)。

PS请注意,这并不意味着也Foo可以访问Bar. 例如Bar::foo,仅在内部可见,Bar因为它已声明private


推荐阅读