友谊得到继承?奇怪

时间:2012-05-18 04:41:28

标签: c++ inheritance friend

据说 - “朋友不是继承的” 这意味着

class c
 {public:
 friend void i_am_friend();
 };

class d:public c
{public:
 //
};

这里 void i_am_friend()在类d中没有继承。更多技术术语(我想是这样的。)

类d的对象不会为 void i_am_friend()分配内存,因为它是基类的朋友。
现在考虑问题没有。 14.3在此页面 http://www.parashift.com/c++-faq/friends.html

class Base {
 public:
   friend void f(Base& b);
   ...
 protected:
   virtual void do_f();
   ...
 };

 inline void f(Base& b)
 {
   b.do_f();
 }

 class Derived : public Base {
 public:
   ...
 protected:
   virtual void do_f();  // "Override" the behavior of f(Base& b)
   ...
 };

 void userCode(Base& b)
 {
   f(b);
 }

这段代码怎么样才对?因为

  

类派生d; // d将不具有朋友功能
      class base * b =& d; //因此b也没有成员函数

因此,对f(b)的调用应该是错误的。

所以说的是正确的: -
友谊不是继承的 或友谊是继承的,但不能在派生类中使用

1 个答案:

答案 0 :(得分:2)

  

友谊不是继承的

即使在你的例子中也是如此。对f(b)的调用不应该是错误,因为Derived对象被转换为Base&类型。

函数f只能访问Base类的私有和受保护部分,但只能访问Derived类的公共部分。