没有长时间的延迟,这里的代码我不知道它为什么会这样做:
#include <iostream>
class A {
private:
void print() { std::cout << "A.print() called" << std::endl; };
public:
template<typename Foo>
class B; //NOTE: no friend!
public:
A();
B<double>* bd;
B<int>* bi;
};
template<typename Foo>
class A::B{
A* callback;
public:
B(A* a):callback(a){};
void print() { callback->print(); }; // Why is this working ???
};
A::A():bd(new B<double>(this)),bi(new B<int>(this)){}
int main(int argc, char **argv)
{
A a;
// a.print(); // error: ‘void A::print()’ is private
a.bd->print();
a.bi->print();
A::B<char> c(&a);
c.print();
A::B<double> d = *a.bd;
d.print();
return 0;
}
好吧,它创建了这个输出:
A.print() called
A.print() called
A.print() called
A.print() called
但为什么?
背景
当我遇到一个与 s 相关的问题时,我最初开始了我的兔子洞之旅friend
。因此,我阅读了朋友声明而不是转发声明(以及此处和此处提到的答案)。因此,在尝试设置一个简单的示例(您在上面看到的结果)时,我发现我实际上似乎根本不需要friend
。
问题
所以这是一个底线问题:为什么一个实例A::B
可以访问A
的私有函数A::print()
?(尽管我确实意识到我可能会误解我的孩子是什么——孩子而不是基础与派生)