您的当前位置:首页>资讯 > 正文

C++ 虚函数(virtual) 和纯虚函数(pure virtual) 的区别

  • 2023-03-25 06:27:17 来源:博客园


【资料图】

在 C++ 中,虚函数(virtual function)是一个可以被子类重写的成员函数,而纯虚函数(pure virtual function)是一个在基类中声明的虚函数,但不会在基类中实现,而是要求派生类中实现的函数。

区别如下:

  1. 虚函数是有实现的,而纯虚函数没有实现。虚函数在基类中有默认实现,子类可以重写它,也可以不重写,但纯虚函数必须在子类中实现。

  2. 如果一个类中包含至少一个纯虚函数,那么这个类就是抽象类,不能直接实例化对象。而虚函数不会强制一个类成为抽象类。

  3. 调用纯虚函数会导致链接错误,除非在派生类中实现该函数。而虚函数可以被调用,如果派生类没有重写该函数,将调用基类的实现。

  4. 纯虚函数可以为接口提供一个规范,子类必须实现这些接口。而虚函数则允许子类通过重写来扩展或修改父类的实现。

  5. 纯虚函数只能在抽象类中声明,而虚函数可以在任何类中声明

例如,考虑一个基类 Shape,它定义了一个纯虚函数 getArea(),用于计算形状的面积。Shape 类不能直接实例化,因为它是一个抽象类,没有提供 getArea() 函数的具体实现。相反,派生类如 Circle 和 Rectangle 必须实现 getArea() 函数以提供具体的实现,并且可以实例化对象。

class Shape {public:    virtual double getArea() = 0; // 纯虚函数};class Circle : public Shape {public:    Circle(double r) : radius(r) {}    double getArea() { return 3.14 * radius * radius; }private:    double radius;};class Rectangle : public Shape {public:    Rectangle(double w, double h) : width(w), height(h) {}    double getArea() { return width * height; }private:    double width;    double height;};int main() {    // Shape s; 不能直接实例化    Circle c(5);    Rectangle r(4, 6);    cout << "Circle area: " << c.getArea() << endl;    cout << "Rectangle area: " << r.getArea() << endl;    return 0;}

下面定义了一个 Shape 类,它包含一个虚函数 getArea(),该函数计算图形的面积。Circle 和 Rectangle 类派生自 Shape 类,并重写 getArea() 函数以提供自己的具体实现

同时,因为是虚函数,因此Shape并不是抽象类,可以被实例化,并且其getArea()可以被调用:

#include using namespace std;class Shape {public:    virtual double getArea() {        cout << "Shape::getArea() called!" << endl;        return 0;    }};class Circle : public Shape {public:    Circle(double r) : radius(r) {}    double getArea() {        cout << "Circle::getArea() called!" << endl;        return 3.14 * radius * radius;    }private:    double radius;};class Rectangle : public Shape {public:    Rectangle(double w, double h) : width(w), height(h) {}    double getArea() {        cout << "Rectangle::getArea() called!" << endl;        return width * height;    }private:    double width;    double height;};int main() {    Shape* pShape = new Shape();    Circle* pCircle = new Circle(5);    Rectangle* pRect = new Rectangle(4, 6);    pShape->getArea();    pCircle->getArea();    pRect->getArea();    delete pShape;    delete pCircle;    delete pRect;    return 0;}

标签:

推荐阅读

C++ 虚函数(virtual) 和纯虚函数(pure virtual) 的区别

在C++中,虚函数(virtualfunction)是一个可以被子类重写的成员函数,而纯虚函数(purevirtualfunction...

60一甲子是什么意思的

60一甲子是指十天干十二地支循环一个周期为六十年,六十甲子是中国人民一个古老的发明创造,其最古老的...

茅台股价攻破2500元关口 具体是什么情况

今天来回顾关于茅台股价攻破2500元关口具体是什么情况的文章,希望对各位小伙伴们有所帮助。【茅台股价攻...

今日热闻!汽车资讯:全新的宝马X5 更长 更宽 格栅更大

汽车现在已经越来越普及,基本上都快实现每家每户都有汽车了,那么汽车这么多的情况之下,我们在用车的...

【世界时快讯】华达科技:实控人拟协议转让5%股份

华达科技公告,控股股东、实际控制人陈竞宏与张耀坤签署了《股份转让协议》,陈竞宏拟将其持有的公司无...

猜您喜欢

【版权及免责声明】凡注明"转载来源"的作品,均转载自其它媒体,转载目的在于传递更多的信息,并不代表本网赞同其观点和对其真实性负责。亚洲在线网倡导尊重与保护知识产权,如发现本站文章存在内容、版权或其它问题,烦请联系。 联系方式:8 86 239 5@qq.com,我们将及时沟通与处理。

教育