虚函数和纯虚函数

在C++中,虚函数纯虚函数是面向对象编程中用于实现多态性的重要概念。下面是对这两个概念的详细讲解:

1. 虚函数(Virtual Function)

虚函数是指在基类中声明为 virtual 的成员函数,目的是允许在派生类中对该函数进行重写(也称为覆盖),并通过基类的指针或引用来调用派生类的实现。这种机制使得函数调用能够在运行时决定(即动态绑定运行时多态),而不是在编译时决定(即静态绑定)。

示例代码:
#include 
using namespace std;

class Base {
public:
    virtual void show() { // 虚函数
        cout << "Base class show() function called" << endl;
    }
};

class Derived : public Base {
public:
    void show() override { // 重写虚函数
        cout << "Derived class show() function called" << endl;
    }
};

int main() {
    Base* basePtr;
    Derived derivedObj;
    
    basePtr = &derivedObj;
    basePtr->show(); // 调用的是Derived类的show(),而不是Base类的show()
    
    return 0;
}

解释:

  • 在基类 Base 中,show() 函数被声明为虚函数(virtual)。
  • 在派生类 Derived 中,show() 函数重写了基类中的 show()
  • main() 函数中,虽然我们使用的是基类的指针 basePtr,但实际指向的是 Derived 类的对象,因此调用 basePtr->show() 时,会执行派生类 Derived 中的 show() 方法。

2. 纯虚函数(Pure Virtual Function)

纯虚函数是一种特殊的虚函数,它在基类中没有任何实现,仅仅是一个接口(类似于抽象方法),其作用是强制派生类必须重写该函数。如果一个类包含至少一个纯虚函数,这个类就称为抽象类,不能被实例化。

语法:
virtual void function_name() = 0;

这里的 = 0 表示这是一个纯虚函数。

示例代码:
#include 
using namespace std;

class Shape {
public:
    virtual void draw() = 0; // 纯虚函数
};

class Circle : public Shape {
public:
    void draw() override {
        cout << "Drawing Circle" << endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        cout << "Drawing Rectangle" << endl;
    }
};

int main() {
    // Shape shape; // 错误!无法实例化抽象类
    Shape* shape1 = new Circle();
    Shape* shape2 = new Rectangle();
    
    shape1->draw(); // 调用的是Circle类的draw()函数
    shape2->draw(); // 调用的是Rectangle类的draw()函数
    
    delete shape1;
    delete shape2;
    
    return 0;
}
解释:
  • Shape 类中有一个纯虚函数 draw(),这使得 Shape 成为一个抽象类,不能创建它的实例。
  • CircleRectangle 类都继承自 Shape,并且必须实现 draw() 函数。
  • main() 函数中,我们可以通过 Shape 的指针来调用派生类的 draw() 方法。

3. 虚函数与纯虚函数的区别

  • 虚函数:可以在基类中提供实现,派生类可以选择重写它。如果不重写,派生类将继承基类的实现。
  • 纯虚函数:没有实现,派生类必须重写它,否则派生类也会变成一个抽象类。

4. 应用场景

  • 虚函数:适用于需要提供默认实现的函数,但允许派生类进行自定义时使用。
  • 纯虚函数:适用于定义一个接口,强制派生类实现具体行为时使用。这是抽象类与接口的核心机制。

通过虚函数和纯虚函数,C++ 提供了强大的多态性支持,使得代码更具扩展性和灵活性。

你可能感兴趣的:(C++,c++,开发语言)