如果没有长时间的延迟,这里的代码,我不知道为什么它做什么,它的作用:
#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
但为什么?
背景
我最初开始我的旅程下来的兔子洞时,我遇到了一个问题,我通过对有做哪些friend
秒。 所以,我读友元声明没有宣布前方 (与所提到的答案, 在这里和这里 )。 因此,试图建立一个简单的例子(其中,您在上面看到的结果),我发现,我似乎实际上并不需要friend
都没有。
题
因此,这里的底线问题: 为什么实例A::B
有机会获得A
民营函数A::print()
(虽然我不知道,我可能误解了什么我的孩子 are-- 的孩子 ,而不是衍生的 基础与)