Heim > Backend-Entwicklung > C++ > Interaktion zwischen C++-Friend-Funktionen und virtuellen Funktionen

Interaktion zwischen C++-Friend-Funktionen und virtuellen Funktionen

王林
Freigeben: 2024-04-16 15:45:01
Original
599 Leute haben es durchsucht

In C++ interagieren Friend-Funktionen mit virtuellen Funktionen, sodass die Friend-Funktion auf die virtuelle Funktion zugreifen und die Friend-Funktion in der abgeleiteten Klasse aufrufen kann, um auf die privaten Mitglieder der Basisklasse zuzugreifen. Diese Interaktion kann verwendet werden, um auf in der Vererbungshierarchie verborgene Daten zuzugreifen oder polymorphes Verhalten zu implementieren.

C++ 友元函数与虚函数的交互

Interaktion zwischen Friend-Funktion und virtueller Funktion in C++

In C++ ist eine Friend-Funktion eine Funktion, die auf private und geschützte Mitglieder einer Klasse zugreifen kann. Virtuelle Funktionen ermöglichen abgeleiteten Klassen, Basisklassenmethoden zu überschreiben. Die Interaktion zwischen Freundfunktionen und virtuellen Funktionen kann auf folgende Weise erreicht werden:

Fall 1: Auf Freundfunktionen und virtuelle Funktionen wird gleichzeitig zugegriffen.

Wenn Freundfunktionen und virtuelle Funktionen gleichzeitig auf Klassenmitglieder zugreifen, Die Friend-Funktion muss explizit angegeben werden. Die virtuelle Funktion, auf die zugegriffen wird.

class Base {
public:
  virtual void foo() { std::cout << "Base::foo()\n"; }
};

class Derived : public Base {
public:
  virtual void foo() override { std::cout << "Derived::foo()\n"; }
};

class Friend {
public:
  static void callFoo(Base& base) { base.foo(); } // 调用 Base::foo()
  static void callFoo(Derived& derived) { derived.foo(); } // 调用 Derived::foo()
};
Nach dem Login kopieren

Fall 2: Friend-Funktionsaufruf in einer virtuellen Funktion

Eine virtuelle Funktion in einer abgeleiteten Klasse kann eine Friend-Funktion aufrufen, um auf private oder geschützte Mitglieder der Basisklasse zuzugreifen.

class Base {
public:
  virtual void foo();
friend class Derived;
};

class Derived : public Base {
public:
  virtual void foo() override {
    // 调用友元函数访问 Base 的私有成员
    std::cout << m_privateMember << "\n";
  }

private:
  int m_privateMember;
};
Nach dem Login kopieren

Praktischer Fall: Zugriff auf versteckte Daten

Freundfunktionen und virtuelle Funktionen können in Kombination verwendet werden, um auf versteckte Daten im Vererbungssystem zuzugreifen.

class Shape {
public:
  virtual double getArea() const = 0;
};

class Circle : public Shape {
public:
  Circle(double radius) : m_radius(radius) {}
  double getArea() const override { return M_PI * m_radius * m_radius; }

private:
  double m_radius;
};

class Rectangle : public Shape {
public:
  Rectangle(double width, double height) : m_width(width), m_height(height) {}
  double getArea() const override { return m_width * m_height; }

private:
  double m_width, m_height;
};

// 友元函数,可访问派生类的私有成员以计算体积
template <typename T>
friend double getVolume(const T& shape) {
  return shape.getArea() * 2;
}

int main() {
  Circle circle(5);
  Rectangle rectangle(3, 4);
  std::cout << "Circle area: " << circle.getArea() << "\n";
  std::cout << "Rectangle area: " << rectangle.getArea() << "\n";
  std::cout << "Circle volume: " << getVolume(circle) << "\n";
  std::cout << "Rectangle volume: " << getVolume(rectangle) << "\n";
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonInteraktion zwischen C++-Friend-Funktionen und virtuellen Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage