今天看VTK源码时,碰到友元关系,在想友元关系是否可以继承。在VS2008下测试,是不能继承的。
class External
{
friend class Base;
private:
void f()
{
cout << "Base f" << endl;
}
};
class Base
{
public:
void f1()
{
cout << "External f1" << endl;
External b;
b.f();
}
};
class Derived : Base
{
public:
void f2()
{
cout << "Derived f2" << endl;
External b;
b.f();
}
};
Base中访问没有问题,Derived不能访问。
另一种情况:
class External
{
friend class Base;
private:
void f()
{
cout << "Base f" << endl;
}
};
class Derived : External
{
private:
void f2()
{
cout << "Derived f2" << endl;
}
};
class Base
{
public:
void f1()
{
cout << "External f1" << endl;
External b;
b.f();
Derived d;
d.f();
d.f2();
}
};
Derived并没有把Base继承为友元,d.f2()是错误的,甚至d.f()也是错误的,也就是说,即使父类中的函数,也不可访问(虽然父类将之声明为友元)。