首頁 >後端開發 >C++ >友元函數對類別的繼承性有什麼影響?

友元函數對類別的繼承性有什麼影響?

PHPz
PHPz原創
2024-04-17 08:33:02834瀏覽

友元函數的繼承性當子類別繼承具有友元函數的類別時:子類別無法繼承友元函數。父類別的友元函數可以存取子類別的私有成員。子類別的友元函數無法存取父類別的私有成員。

友元函數對類別的繼承性有什麼影響?

友元函數對類別的繼承性影響

前言

友元函數是一種特殊的C 函數,它可以在類別的作用域之外存取該類別的私有成員。當涉及到類別的繼承時,理解友元函數的行為至關重要。

友元函數與繼承

當子類別繼承一個有友元函數的類別時,下列規則適用:

  • #子類別無法繼承友元函數:友元函數是與特定類別相關聯的。子類別無法繼承父類別的友元函數。
  • 父類別的友元函數可以存取子類別的私有成員:如果父類別和子類別互相了解(即,父類別是子類別的基底類別或子類別是父類別的衍生類別),則父類別的友元函數可以存取子類別的私有成員。
  • 子類別的友元函數無法存取父類別的私有成員:相反,子類別的友元函數無法存取父類別的私有成員,即使父類別和子類別相互了解。

實戰案例

考慮以下範例程式碼:

#include <iostream>

class Base {
  friend void print(Base& b);  // 父类友元函数
private:
  int x;
};

class Derived : public Base {
  friend void access(Derived& d);  // 子类友元函数
private:
  int y;
};

void print(Base& b) { std::cout << b.x << std::endl; } // 父类友元函数访问私有成员 x

void access(Derived& d) { std::cout << d.x << " " << d.y << std::endl; } // 子类友元函数访问私有成员 x 和 y

int main() {
  Base b;
  b.x = 10;
  print(b);  // 输出:10

  Derived d;
  d.x = 20;
  d.y = 30;
  access(d);  // 输出:20 30
  print(d);  // 输出:20
}

在這個範例中:

  • 父類別Base 有一個友元函數print(),它可以存取x 私有成員。
  • 子類別 Derived 有一個友元函數 access(),它可以存取父類別私有成員 x
  • 子類別Derived 的物件d 可以被父類別Base 友元函數print() 訪問,但是無法存取父類別的私有成員x

以上是友元函數對類別的繼承性有什麼影響?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn