primer上明确说,友元是不能继承的。
但是,若是使用派生类实参为基类实参复制,这种情况下还是可以成功执行友元函数的。
代码如下:
#include <iostream> //③验证友元的继承
using namespace std;
class A
{
public:
friend void f(A *p);
A()
{
n=0;
}
virtual void display()
{
cout<<"hello world A"<<endl;
}
protected:
int n;
};
void f(A *p)
{
cout<<p->n<<endl;
}
class B:public A
{
public:
B():A() { m=0; }
virtual void display()
{
cout<<"hello world B"<<endl;
}
protected:
int m;
};
int main()
{
B b;
A *a=&b;
a->display(); //调用B类的display
a->A::display(); //调用A类的display
A &aa=b;
aa.display(); //调用B类的display
aa.A::display(); //调用A类的display
A a1;
A *p=&a1;
f(p);
B b1;
p=&b1;
f(p);
return 0;
}