#include "stdafx.h" #include <iostream> /*一个类A声明为一个为B的友元类之后,类A就可以任意访问类B的所有 成员(公有的、保护的和私有的)。但是,如果一个类D继承自类B, 类B中的友元关系统并不会被继承,也就是说,类A是类B的友元但却不是 类B的派生类D的友元。即类A不可以访问类D的保护的和私有的成员。 在上面的代码中,被注释了的部分不能够通过编译,因为D不是A的友 元类,B的友元关系并没有被继承。而在A的Print函数成员中,参数为 基类B的Const引用;而实参即可以是D类的对象,从而实现了在A类中 调用D类成员的目的。当然,你完全可以把A声明为D的友元类。对这种 机制的解释:首先,在A的Print函数中,通过B类对象调用其私有的虚 函数(b.Print()),由于A是B的友元,该调用是完全合法的。而在用 D对象调用A的Print函数时,b.Print()调用动态绑定到了D类对象 的函数版本的调用。这里,也说明了另外一个问题:类成员的访问控制 只是在编译时有效。*/ class B { friend class A; private: virtual void Print() const { std::cout<<"B"<<std::endl; } }; class D : public B { friend class A; private: virtual void Print() { std::cout<<"D"<<std::endl; } }; class A { public: A() { B b; std::cout<<"A Constructor:"; b.Print(); // D d; // d.Print(); //error: virtual void D::Print() const is private } void Print( const B &b) { std::cout<<"A->"; b.Print(); } }; int _tmain(int argc, _TCHAR* argv[]) { A a; B b; D d; a.Print(b); a.Print(d); return 0; }