友谊得到继承??奇怪的

Posted

技术标签:

【中文标题】友谊得到继承??奇怪的【英文标题】:friendship getting inherited ?? strange 【发布时间】:2012-05-18 04:41:28 【问题描述】:

正如所说 - “朋友不会继承”。 这意味着

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 将没有友元函数 类基 *b=&d; //结果b也没有成员函数

所以这里调用 f(b) 应该是错误的。

那么说什么是正确的:- 友谊不是遗传的 或者友谊被继承但不能在派生类中使用

【问题讨论】:

【参考方案1】:

友谊不会继承

即使在您的示例中也是如此。那里对 f(b) 的调用应该不会出错,因为 Derived 对象被转换为 Base& 类型。

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

【讨论】:

以上是关于友谊得到继承??奇怪的的主要内容,如果未能解决你的问题,请参考以下文章

C++如何优雅地处理不被继承的友谊

在 C++ 中继承友谊?

奇怪的指针行为 C++ / 继承

Maven插件管理配置继承奇怪行为

有一道奇怪的数学题。(下边是详细内容)

EF 5.0 table-per-type 继承给出了奇怪的查询