21xrx.com
2025-04-12 00:28:32 Saturday
文章检索 我的文章 写文章
如何在C++中调用基类的虚函数?
2023-07-01 18:40:07 深夜i     21     0
C++ 调用 基类 虚函数 继承

C++中的继承是面向对象编程的基本概念之一,通过继承可以方便地重用代码并实现多态性。在继承关系中,派生类通常会重写基类的虚函数,但是在某些情况下需要在派生类中调用基类的虚函数。本文将介绍在C++中如何调用基类的虚函数。

一、使用作用域解析运算符

当派生类重写了基类的虚函数时,基类的实现将被覆盖。但是,如果派生类需要调用基类的实现,可以使用作用域解析运算符(::)并指定基类的名称。

例如,假设有一个基类Animal和一个派生类Cat,它们都有一个虚函数speak()。如果Cat需要调用Animal的实现,可以使用作用域解析运算符来调用:

class Animal {
public:
  virtual void speak()
    cout << "Animal speaks!" << endl;
  
};
class Cat : public Animal {
public:
  void speak() {
    cout << "Cat speaks!" << endl;
    Animal::speak(); // 调用Animal的实现
  }
};

二、使用指向基类的指针或引用

另一种调用基类虚函数的方法是使用指向基类的指针或引用。此时,派生类中的函数可以通过指向基类的指针或引用来调用基类的虚函数。

以下是一个例子:

class Shape {
public:
  virtual void draw() {
    cout << "Shape::draw()" << endl;
  }
};
class Circle : public Shape {
public:
  void draw() {
    cout << "Circle::draw()" << endl;
    Shape::draw(); // 调用Shape的实现
  }
};
int main() {
  Circle c;
  Shape* s = &c; // 指向派生类的基类指针
  s->draw();   // 调用基类的虚函数
  return 0;
}

在上面的例子中,Circle派生自Shape。Circle的虚函数draw()覆盖了Shape的虚函数draw(),但是通过指向派生类的基类指针s,可以调用Shape的实现。

三、使用final关键字

C++11引入了一个新关键字final,可以用于禁止在派生类中重写虚函数。这个特性可以确保基类的实现在派生类中不会被覆盖,从而可以方便地调用基类的虚函数。

以下是一个示例:

class Animal {
public:
  virtual void speak() final // 这个虚函数被标记为“final”
    cout << "Animal speaks!" << endl;
  
};
class Cat : public Animal {
public:
  // 下面这个函数不能重写Animal::speak()
  void speak() {
    cout << "Cat speaks!" << endl;
    Animal::speak(); // 调用Animal的实现
  }
};

在上面的例子中,Animal的虚函数speak()被标记为final,Cat中不能重写这个虚函数。这样可以确保Cat中调用的始终是Animal的实现。

总结

本文介绍了在C++中调用基类的虚函数的三种方法:使用作用域解析运算符、使用指向基类的指针或引用、使用final关键字。这些方法都可以确保基类的实现在派生类中得以重用。当需要在派生类中调用基类的虚函数时,可以根据实际情况选择合适的方法。

  
  

评论区