C++的虚函数与纯虚函数
发布人:shili8
发布时间:2025-02-03 08:38
阅读次数:0
**C++中的虚函数与纯虚函数**
在C++中,虚函数(virtual function)和纯虚函数(pure virtual function)是面向对象编程的重要概念。它们允许我们定义类之间的接口,而不必关心具体实现细节。
### 虚函数虚函数是一种可以被子类重写的函数。它通过在类中使用`virtual`关键字来标记。虚函数的主要特点是:
* 子类可以重写父类中的虚函数。
* 当我们创建一个指向父类的指针,并调用其虚函数时,实际调用的函数是子类中的实现。
示例代码:
cppclass Animal { public: virtual void sound() { // 虚函数 std::cout << "动物会叫" << std::endl; } }; class Dog : public Animal { public: void sound() override { // 重写父类的虚函数 std::cout << "狗会叫" << std::endl; } }; int main() { Animal* animal = new Dog(); // 创建一个指向Dog的Animal指针 animal->sound(); // 调用虚函数,实际调用的函数是Dog中的实现 return0; }
在这个例子中,我们定义了一个`Animal`类,它包含一个虚函数`sound()`。然后我们创建了一个`Dog`类,它继承自`Animal`并重写了`sound()`函数。在`main()`函数中,我们创建了一个指向`Dog`的`Animal`指针,并调用其`sound()`函数。由于`sound()`是虚函数,实际调用的函数是`Dog`中的实现。
### 纯虚函数纯虚函数是一种特殊类型的虚函数,它不提供任何具体实现,而只定义了一个接口。它通过在类中使用`=0`来标记。纯虚函数的主要特点是:
* 子类必须重写父类中的纯虚函数。
* 当我们创建一个指向父类的指针,并调用其纯虚函数时,编译器会报错。
示例代码:
cppclass Shape { public: virtual void draw() =0; // 纯虚函数}; class Circle : public Shape { public: void draw() override { // 重写父类的纯虚函数 std::cout << "绘制一个圆" << std::endl; } }; int main() { Shape* shape = new Circle(); // 创建一个指向Circle的Shape指针 shape->draw(); // 调用纯虚函数,编译器会报错 return0; }
在这个例子中,我们定义了一个`Shape`类,它包含一个纯虚函数`draw()`。然后我们创建了一个`Circle`类,它继承自`Shape`并重写了`draw()`函数。在`main()`函数中,我们创建了一个指向`Circle`的`Shape`指针,并调用其`draw()`函数。由于`draw()`是纯虚函数,编译器会报错。
### 总结在C++中,虚函数和纯虚函数是面向对象编程的重要概念,它们允许我们定义类之间的接口,而不必关心具体实现细节。虚函数可以被子类重写,而纯虚函数必须被子类重写。通过使用虚函数和纯虚函数,我们可以创建更灵活、更易于维护的代码结构。
### 参考* C++ Primer Plus(第5版)
* Effective C++(第3版)
* Modern C++ Design(第2版)