什么是虚函数和纯虚函数?
时间: 2024-02-26 22:51:00 浏览: 89
虚函数是在基类中声明的函数,可以在派生类中进行重写。通过使用虚函数,可以实现运行时多态性,即在运行时根据对象的实际类型来调用相应的函数。
纯虚函数是在基类中声明的没有实际实现的虚函数。它只有函数的声明,没有函数体。纯虚函数用于定义接口,要求派生类必须实现该函数。如果一个类中包含了纯虚函数,那么它就是一个抽象类,无法实例化。
相关问题
2. 虚函数和纯虚函数有什么区别?何时应该使用虚函数或纯虚函数?
虚函数和纯虚函数都是用于实现多态性的机制。
虚函数是一个可以被继承类覆盖的函数,它可以被继承类重新实现,同时保留原有的函数签名和返回值类型。虚函数的作用是允许基类指针或引用在运行时指向派生类对象,从而实现多态性。虚函数在基类中的实现可以有默认的函数体,但是如果派生类没有实现该虚函数,则调用基类中的虚函数。
纯虚函数是指在基类中没有函数体实现的虚函数,纯虚函数必须被派生类实现。基类中含有纯虚函数的类称为抽象类,抽象类不能够直接实例化对象,只能够作为基类来派生出具体的类。纯虚函数的作用是强制要求派生类实现该函数,同时也允许基类指针或引用在运行时指向派生类对象,从而实现多态性。
虚函数和纯虚函数的区别在于,虚函数可以在基类中提供默认的实现,而纯虚函数没有函数体实现。当基类中的函数在派生类中有不同的实现时,应该使用虚函数。当基类中的函数需要强制要求派生类实现时,应该使用纯虚函数。
什么是虚函数和纯虚函数
### C++ 中虚函数和纯虚函数的概念及用法
#### 虚函数的定义与作用
虚函数是用于实现动态多态的一种机制。在C++中,如果希望基类指针能够调用派生类中的特定方法,则需要将该方法声明为虚函数。这样做的目的是让编译器知道,在运行时需要查找实际对象所属的具体类型,并据此决定调用哪一个版本的方法[^1]。
当一个成员函数被声明为`virtual`后,它就成为了一个虚函数。这意味着即使通过基类类型的指针或引用去访问这个函数,也会根据当前对象的真实类型来确定到底执行哪一版的实现逻辑[^2]。
```cpp
// 示例代码展示虚函数的工作原理
#include <iostream>
using namespace std;
class Animal {
public:
virtual void speak() { cout << "Animal speaks" << endl; } // 声明为虚函数
};
class Dog : public Animal {
public:
void speak() override { cout << "Dog barks" << endl; } // 重载父类的speak()
};
void makeSound(Animal& animal){
animal.speak();
}
int main(){
Dog myDog;
makeSound(myDog); // 输出:"Dog barks"
}
```
在此案例中可以看到虽然传递给`makeSound()`的是一个基于`Animal`类型的参数,但由于`speak()`已被设为虚函数,所以实际上调用了对应于传入实体(`myDog`)的那个更具体的覆写版本—也就是来自`Dog`类别的那个变体[^3]。
#### 纯虚函数的意义及其应用场合
不同于普通的虚函数,纯虚函数不仅表明这是一个可被子类别覆盖的操作接口,同时还强制要求所有的非抽象衍生都必须提供自己对该操作的独特诠释方案。换句话说就是说含有未完成状态(即仅有原型而无具体实现细节)之纯虚函式的类别本身无法实例化出来任何物件个体;只有那些完全填补好了所有必要资讯后的后代们才具备这样的资格[^4]。
我们通常会在如下场景下运用到纯虚函数:
- 当我们需要构建一组共享共同特征却又各自拥有独特行为模式的事物集合的时候;
- 或者当我们想要建立某种框架结构,规定好某些必要的功能点位留给未来扩展使用之时。
下面给出一段简单的示范程序:
```cpp
#include <iostream>
using namespace std;
class Shape {
protected:
double width, height;
public:
Shape(double w = 0, double h = 0):width(w),height(h){}
virtual double area() const = 0; // 定义纯虚函数
};
class Rectangle: public Shape{
public:
Rectangle(double w,double h):Shape(w,h){};
double area()const{return(width * height);} // 提供area的具体实现
};
class Triangle: public Shape{
public:
Triangle(double w,double h):Shape(w,h){};
double area()const{return (width * height)/2;} // 另一种不同的计算方式
};
int main(){
Rectangle rect(5,6);
Triangle tria(5,6);
cout<<"Rectangle Area:"<<rect.area()<<endl;
cout<<"Triangle Area:"<<tria.area()<<endl;
}
```
在这个例子里面我们可以看到无论是矩形还是三角形它们都有各自的面积算法,而这正好可以通过设定一个通用的基础形状界面再分别针对每种特殊图形给予专属解答的方式来达成目标[^5]。
---
阅读全文
相关推荐














