ホームページ >バックエンド開発 >C++ >フレンド関数はクラスの継承にどのような影響を与えますか?

フレンド関数はクラスの継承にどのような影響を与えますか?

PHPz
PHPzオリジナル
2024-04-17 08:33:02837ブラウズ

フレンド関数の継承 サブクラスがフレンド関数を持つクラスを継承する場合 サブクラスはフレンド関数を継承できません。親クラスのフレンド関数は、子クラスのプライベート メンバーにアクセスできます。サブクラスのフレンド関数は、親クラスのプライベート メンバーにアクセスできません。

フレンド関数はクラスの継承にどのような影響を与えますか?

#フレンド関数がクラス継承に及ぼす影響

序文

フレンド Aメタ関数は、クラスのスコープ外にあるクラスのプライベート メンバーにアクセスできる特別な 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
}

この例では:

Parentクラス
    Base
  • にはフレンド関数 print() があり、#xx プライベート メンバーにアクセスできます。 サブクラス Derived
  • にはフレンド関数
  • access() があり、親クラスのプライベート メンバー x にアクセスできます。 サブクラス Derived
  • のオブジェクト
  • d は、親クラス Base フレンド関数 print() によってアクセスできます。ただし、親クラスのプライベート メンバー #xxx にはアクセスできません。

以上がフレンド関数はクラスの継承にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。