Home  >  Article  >  Backend Development  >  Interaction between C++ friend functions and virtual functions

Interaction between C++ friend functions and virtual functions

王林
王林Original
2024-04-16 15:45:01543browse

In C, friend functions interact with virtual functions so that friend functions can access virtual functions and call friend functions in derived classes to access private members of the base class. This interaction can be used to access data hidden in the inheritance hierarchy or to implement polymorphic behavior.

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

C Interaction between friend function and virtual function

In C, a friend function is a method that can access class private functions and protected member functions. Virtual functions allow derived classes to override base class methods. The interaction between friend functions and virtual functions can be achieved in the following ways:

Case 1: Friend functions and virtual functions are accessed at the same time

When friend functions and virtual functions When accessing class members at the same time, you need to clearly specify which class's virtual function the friend function is accessing.

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()
};

Case 2: Friend function call in virtual function

The virtual function of the derived class can call the friend function to access the private or protected base class member.

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

Practical case: accessing hidden data

Friend functions and virtual functions can be used in combination to access hidden data in the inheritance system.

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";
}

The above is the detailed content of Interaction between C++ friend functions and virtual functions. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn