基数 class 和该基数 class 的派生 class 可以有一个共同的朋友 class 并且是两个 class 的朋友吗?

Can a base class and a derived class of that base class have a common friend class which is a friend of both the classes?

我知道朋友 class 可以访问 class 的私有元素,所以我想知道派生的 class 可以使用朋友 class 来访问基 class 的私有成员,如果朋友 ​​class 是基 class 和派生 class?

的朋友

我是一个完全的编程初学者,我刚刚开始学习 C++ 中的 OOP;当我得知朋友 functions/classes.

时,我就想到了这个问题。

在 C++ 中, 为了向 class 的私有或受保护成员授予访问权限,我们应该定义一个友元 class 或一个函数(或另一个 class 的方法)。

友情不遗传。

因此,为了从另一个 class 访问基 class 和派生 class 的私有或受保护成员,您应该将“另一个” class 定义为基数 class 及其派生 class.

的朋友

对于 “....如果朋友 ​​class 与两个基 class 和派生的 class?....”问题。

友谊不是相互的。如果 class Y 是 Y 的朋友,那么 Y 不会自动成为 X 的朋友。 因此派生 class 无法使用基 class.

的朋友访问基 class 的私有成员

可以通过使用 friend class F.

从派生 class D 访问基 class B 的私有成员
  1. B应该把F定义为朋友。 (F 可以访问 B 的私有和受保护成员)
  2. F应该把D定义为好友。(D可以访问F的private和protected成员)
  3. F 应该定义访问 and/modify B 的所有私有成员的方法。
  4. F 应该在类型 B 中定义一个属性,并将此属性设置为构造函数或方法中的参数。
  5. D应该在F类型中定义一个属性,并使用4.
  6. 中定义的方法或构造函数将自身设置为该属性

最终D可以通过类型F中的属性访问B的所有私有成员

可以在同一个文件中定义相同的class,这样两者就可以访问好友功能了。 Transaction 的前向声明允许 Customer class 引用 Transaction class 而不会导致编译器错误。 如果您想了解更多关于这些事情的信息,请考虑阅读一本书,因为互联网对学习来说并不是很好,有时甚至有毒。

#include<iostream>
using namespace std;
class Transaction;
class Customer
{
   friend void applyTransaction(Customer, Transaction);
private:
   int custNum;
   double balanceDue;
public:
   Customer(int = 0, double = 0.0);
};
Customer::Customer(int num, double balance)
{
   custNum = num;
   balanceDue = balance;
}
class Transaction
{
   friend void applyTransaction(Customer, Transaction);
private:
   int transactionNum;
   int custNum;
   double amount;
public:
   Transaction(int = 0, int = 0, double = 0.0);
};
Transaction::Transaction(int trans, int cust, double amt)
{
   transactionNum = trans;
   custNum = cust;
   amount = amt;
}
void applyTransaction(Customer cust, Transaction trans)
{
   cout << "Customer #" << cust.custNum <<
   " original balance of $" <<
   cust.balanceDue << endl;
   cust.balanceDue += trans.amount;
   cout << "After transaction #" <<
   trans.transactionNum << " for " <<
   trans.amount << " the new balance is $" <<
   cust.balanceDue << endl;
}