21xrx.com
2025-04-18 22:44:49 Friday
文章检索 我的文章 写文章
C++中实现多个类共用一个函数
2023-06-23 05:22:19 深夜i     13     0
C++ 函数 共用 多个

在C++中,我们经常需要让多个类共用一个函数。这种情况下,我们可以使用虚函数或重载函数的方式来实现。

虚函数是指在基类中定义的一个函数,其函数体可以为空,子类可以对其进行重写,并在运行时动态绑定到合适的子类。对于多个不同类型的对象,可以通过定义相同的虚函数来共享代码。例如:

class Shape {
public:
  virtual double area() const = 0;
};
class Circle : public Shape {
public:
  Circle(double r) : radius(r) {}
  double area() const override { return 3.14 * radius * radius; }
private:
  double radius;
};
class Rectangle : public Shape {
public:
  Rectangle(double w, double h) : width(w), height(h) {}
  double area() const override { return width * height; }
private:
  double width;
  double height;
};
int main() {
  Shape* s1 = new Circle(5);
  Shape* s2 = new Rectangle(3, 4);
  std::cout << s1->area() << std::endl; // 输出78.5
  std::cout << s2->area() << std::endl; // 输出12
  return 0;
}

在上面的代码中,我们定义了一个抽象类Shape,其中包含一个纯虚函数area(),并定义了两个具体类Circle和Rectangle,它们分别重写了这个函数。在main函数中,我们声明了两个指向Shape类型的指针,分别指向了一个Circle对象和一个Rectangle对象,并调用了它们的area()函数。

重载函数是指在同一个作用域内,在函数名相同的基础上,通过不同的参数个数或类型来区分函数。如果我们需要让多个类共用一个函数,但是它们的函数签名不同,那么可以使用重载函数的方式来实现。例如:

class Person {
public:
  void eat() std::cout << "Person is eating." << std::endl;
};
class Student : public Person {
public:
  void eat(int id) std::cout << "Student " << id << " is eating." << std::endl;
};
class Teacher : public Person {
public:
  void eat(std::string subject) std::cout << "Teacher is eating " << subject << "." << std::endl;
};
int main() {
  Person p;
  Student s;
  Teacher t;
  p.eat(); // 输出Person is eating.
  s.eat(123); // 输出Student 123 is eating.
  t.eat("lunch"); // 输出Teacher is eating lunch.
  return 0;
}

在上面的代码中,我们定义了一个基类Person和两个派生类Student和Teacher,它们分别重载了eat()函数并改变了参数类型。在main函数中,我们实例化了一个Person对象、一个Student对象和一个Teacher对象,并调用它们的eat()函数,通过不同的参数个数或类型来区分函数的行为。

  
  

评论区