C++ 虚函数与纯虚函数的使用与区别

yizhihongxing

下面我将为您详细讲解C++虚函数和纯虚函数的使用与区别。

一、C++虚函数

1. 虚函数的定义

C++虚函数是一种特殊的函数,它在基类中被声明为虚函数,然后在派生类中重写该函数。在运行时,通过对象调用该函数时,会根据对象实际指向的类型来调用对应的函数版本,即动态绑定。

虚函数的声明方式如下:

class A {
public:
    virtual void func();
};

2. 虚函数的使用

使用虚函数的目的是为了让子类能够重写基类的函数,实现多态性。示例如下:

class Animal {
public:
    virtual void sound() {
        std::cout << "This animal makes a sound." << std::endl;
    }
};

class Dog : public Animal {
public:
    void sound() override {
        std::cout << "The dog barks." << std::endl;
    }
};

int main() {
    Animal *p = new Dog();
    p->sound(); // 调用Dog类中的sound函数
    delete p;
    return 0;
}

上述代码中,我们定义了一个Animal类和一个Dog类(继承自Animal类)。Animal类中定义了一个虚函数sound,而Dog类中重写了该函数,实现了不同的功能。在main函数中,我们创建了一个Animal类型的指针p,并将其指向一个Dog对象。当调用p的sound函数时,会动态绑定到Dog类中的sound函数,实现多态性。

二、C++纯虚函数

1. 纯虚函数的定义

C++纯虚函数是指在基类中声明但没有实现的虚函数。纯虚函数只有函数声明,没有函数体,并且必须在继承该类的派生类中进行实现,否则编译器会报错。

纯虚函数的声明方式如下:

class A {
public:
    virtual void func() = 0;
};

2. 纯虚函数的使用

纯虚函数主要用于定义接口,让派生类必须实现该函数。示例如下:

class Shape {
public:
    virtual double area() const = 0;
};

class Circle : public Shape {
public:
    explicit Circle(double r) : radius(r) {}
    double area() const override {
        return 3.14 * radius * radius;
    }
private:
    double radius;
};

class Rectangle : public Shape {
public:
    explicit Rectangle(double len, double wid) : length(len), width(wid) {}
    double area() const override {
        return length * width;
    }
private:
    double length;
    double width;
};

int main() {
    Shape *s1 = new Circle(5.0);
    Shape *s2 = new Rectangle(3.0, 4.0);
    std::cout << "The area of the circle is " << s1->area() << std::endl;
    std::cout << "The area of the rectangle is " << s2->area() << std::endl;
    delete s1;
    delete s2;
    return 0;
}

上述代码中,我们定义了一个Shape类,其中只有一个纯虚函数area,没有函数体。而Circle类和Rectangle类都继承自Shape类,并实现了area函数。在main函数中,我们创建了一个指针s1和s2,分别指向一个Circle对象和一个Rectangle对象。当调用s1和s2的area函数时,会动态绑定到Circle和Rectangle类中的area函数,实现了不同的功能。

三、C++虚函数与纯虚函数的区别

  1. 虚函数可以有函数体,纯虚函数没有函数体。
  2. 含有纯虚函数的类是抽象类,无法实例化。派生类必须实现纯虚函数才能被实例化。
  3. 虚函数可以被继承下来,纯虚函数必须在派生类中重新定义。

希望以上内容能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 虚函数与纯虚函数的使用与区别 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • mysql区间范围查询问题

    以下是“MySQL区间范围查询问题的完整攻略”的标准markdown格式文本,其中包含两个示例: MySQL区间范围查询问题的解决方法 MySQL中,我们经常需要进行区间范围查询,例如查询某个时间段内的数据、查询某个价格区间内的商品等。但是,在进行区间范围查询时,我们需要注意一些问题,以避免查询结果不准确或者查询效率低下。以下是MySQL区间范围查询问题的解…

    other 2023年5月10日
    00
  • codeforces 704A (队列模拟) Thor

    下面是“Codeforces 704A Thor”的完整攻略,包括题目描述、解题思路和两个示例等方面。 题目描述 有 $n$ 个应用程序,每个应用程序都有一个通知。现在,你需要实现一个通知中心,支持以下两种操作: 将某个应用程序的通知加入通知中心。 将通知中心中某个应用程序的通知全部清空。 其中,第一种操作的时间复杂度为 $O(1)$,第二种操作的时间复杂度…

    other 2023年5月5日
    00
  • 详解Android中Application设置全局变量以及传值

    详解Android中Application设置全局变量以及传值 在Android开发中,有时候我们需要在整个应用程序中共享一些数据或变量。为了实现这一目的,我们可以使用Application类来设置全局变量,并在不同的组件之间传递值。下面是一个完整的攻略,包含了设置全局变量和传值的过程。 设置全局变量 创建一个自定义的Application类,继承自andr…

    other 2023年7月29日
    00
  • 苹果watchOS7 Beta 2 推送 watchOS7 开发者预览 Beta 2更新内容一览

    苹果watchOS7 Beta 2 推送 watchOS7 开发者预览 Beta 2更新内容一览 简介 苹果watchOS7 Beta 2已经推送,开发者可以通过 https://developer.apple.com/download/ 上直接下载安装。 本文将详细讲解watchOS7 Beta 2的更新内容。 更新内容 以下是watchOS7 Beta …

    other 2023年6月26日
    00
  • Shell特殊变量(Shell $#、$*、$@、$?、$$)的使用

    Shell特殊变量的使用攻略 Shell特殊变量是一些预定义的变量,用于在Shell脚本中获取一些特定的信息。在本攻略中,我们将详细讲解Shell特殊变量$#、$*、$@、$?和$$的使用方法,并提供示例说明。 1. $# – 命令行参数个数 $#用于获取命令行参数的个数。它返回一个整数值,表示传递给脚本或函数的参数个数。 示例: 假设我们有一个名为scri…

    other 2023年8月9日
    00
  • HarmonyOS鸿蒙基本控件的实现

    下面我将为你详细讲解“HarmonyOS鸿蒙基本控件的实现”的完整攻略。 什么是HarmonyOS? HarmonyOS是华为开源的一款分布式操作系统。它能够在各种场景下实现设备和平台的无缝协同工作,为用户提供多种简单易用的服务。HarmonyOS所有的API是开放的,可以方便地通过开发者平台进行使用。 鸿蒙基本控件 在HarmonyOS中,基本控件是实现交…

    other 2023年6月27日
    00
  • 关于尾递归的使用详解

    关于尾递归的使用详解 什么是尾递归 尾递归可以理解为一种特殊的递归,它是指递归函数在执行完成最后一步操作后,调用自身函数。也就是说,函数调用发生在函数的最后一条语句中,不再执行任何操作。 相比于普通递归,尾递归有两个主要优点: 尾递归更加高效,因为它只需保存一个栈帧,而不是保存每一层递归都需要的栈帧。 尾递归可以通过尾递归优化,将递归函数转化为迭代函数,从而…

    other 2023年6月27日
    00
  • 基于python实现从尾到头打印链表

    下面是“基于python实现从尾到头打印链表”的完整攻略。 题目描述 输入一个链表的头节点,按照从尾到头的顺序返回节点的值。 解题思路 要打印链表的倒序,可以考虑借用栈的数据结构来实现。可以通过遍历链表,将节点依次压入栈中,最后依次弹出栈中的元素,即可实现将链表的值按照从尾到头的顺序打印出来。另一种更优化的方法是递归实现,将打印当前节点的值的过程看作递归操作…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部