在C++中,友元函數(friend function)是一種非成員函數,它可以訪問類的私有(private)和保護(protected)成員。在處理繼承關系時,友元函數可以訪問基類(base class)和派生類(derived class)的私有和保護成員。
以下是一個簡單的例子,展示了如何在繼承關系中處理友元函數:
#include <iostream>
using namespace std;
class Base {
public:
Base(int value) : value_(value) {}
// 聲明友元函數
friend void printValue(const Base& obj);
private:
int value_;
};
// 定義友元函數
void printValue(const Base& obj) {
cout << "Base value: " << obj.value_ << endl;
}
class Derived : public Base {
public:
Derived(int value, int derivedValue) : Base(value), derivedValue_(derivedValue) {}
// 聲明友元函數
friend void printDerivedValue(const Derived& obj);
private:
int derivedValue_;
};
// 定義友元函數
void printDerivedValue(const Derived& obj) {
cout << "Derived value: " << obj.derivedValue_ << endl;
}
int main() {
Base base(10);
Derived derived(20, 30);
// 友元函數可以訪問基類和派生類的私有成員
printValue(base); // 輸出:Base value: 10
printValue(derived); // 輸出:Base value: 20
printDerivedValue(derived); // 輸出:Derived value: 30
return 0;
}
在這個例子中,我們有一個基類Base
和一個派生類Derived
。基類有一個私有成員value_
,派生類有一個私有成員derivedValue_
。我們聲明了兩個友元函數printValue
和printDerivedValue
,它們分別用于打印基類和派生類的值。
在main
函數中,我們創建了基類和派生類的對象,并調用了這兩個友元函數。可以看到,友元函數可以訪問基類和派生類的私有成員。這是因為友元函數不是類的成員函數,所以它不受類的訪問控制限制。