Maison >développement back-end >C++ >Quel impact les fonctions amies ont-elles sur l'héritage de classe ?

Quel impact les fonctions amies ont-elles sur l'héritage de classe ?

PHPz
PHPzoriginal
2024-04-17 08:33:02837parcourir

Héritage des fonctions ami Lorsqu'une sous-classe hérite d'une classe avec des fonctions ami : La sous-classe ne peut pas hériter de la fonction ami. Les fonctions amies de la classe parent peuvent accéder aux membres privés de la classe enfant. Les fonctions amies d'une sous-classe ne peuvent pas accéder aux membres privés de la classe parent.

Quel impact les fonctions amies ont-elles sur lhéritage de classe ?

L'impact des fonctions ami sur l'héritage de classe

Avant-propos

Une fonction ami est une fonction C++ spéciale qui peut accéder aux membres privés de la classe en dehors de la portée de la classe. En matière d’héritage de classe, il est crucial de comprendre le comportement des fonctions amies.

Fonctions ami et héritage

Lorsqu'une sous-classe hérite d'une classe qui a des fonctions ami, les règles suivantes s'appliquent :

  • Les sous-classes ne peuvent pas hériter des fonctions ami : Les fonctions ami sont liées à une classe spécifique liée. Les sous-classes ne peuvent pas hériter des fonctions amies des classes parentes.
  • Les fonctions amies d'une classe parent peuvent accéder aux membres privés de la classe enfant : Si la classe parent et la classe enfant se connaissent (c'est-à-dire que la classe parent est la classe de base de la classe enfant ou que la classe enfant est une classe dérivée de la classe parent), alors les fonctions Friend de la classe parent d'une classe peuvent accéder aux membres privés de la sous-classe.
  • Les fonctions ami d'une sous-classe ne peuvent pas accéder aux membres privés de la classe parent : En revanche, une fonction ami d'une sous-classe ne peut pas accéder aux membres privés de la classe parent, même si la classe parent et la classe enfant savent l'un l'autre.

Cas pratique

Considérons l'exemple de code suivant :

#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
}

Dans cet exemple :

  • La classe parent Base a une fonction amie print() , qui a accès à x membres privés. Base 有一个友元函数 print(),它可以访问 x 私有成员。
  • 子类 Derived 有一个友元函数 access(),它可以访问父类私有成员 x
  • 子类 Derived 的对象 d 可以被父类 Base 友元函数 print() 访问,但是无法访问父类的私有成员 x
  • La sous-classe Derived a une fonction amie access(), qui peut accéder au membre privé de la classe parent x.
🎜L'objet d de la sous-classe Derived est accessible par la fonction amie de la classe parent Base print() , mais impossible d'accéder au membre privé x de la classe parent. 🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn