【无标题】

当一个类声明了虚函数,这个虚函数性质具有继承的性质,在以后所有层次继承的类中,都是虚函数。

普通虚函数在子类中可以不被重写,但是纯虚函数必须被重写。

通过基类的指针访问子类,调用虚函数,调用的都是子类的虚函数。

并不是子类一定无法访问基类的虚函数,可以通过域名作用符访问。

普通虚函数在子类中可以不被重写,但是纯虚函数必须被重写,对此分别举出两个例子:

在C++中,虚函数和纯虚函数在继承关系中起着不同的作用。以下是两个例子,分别展示虚函数和纯虚函数在子类中的不同行为。

虚函数

cpp 复制代码
#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base class function" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() {
        std::cout << "Derived class function" << std::endl;
    }
};

int main() {
    Base* basePtr = new Base();
    Base* derivedPtr = new Derived();

    basePtr->show(); // 输出 "Base class function"
    derivedPtr->show(); // 输出 "Derived class function"

    delete basePtr;
    delete derivedPtr;

    return 0;
}

在这个例子中,Base类有一个虚函数show()。在Derived类中,我们重写了show()函数,所以当我们通过Derived类的指针调用show()时,将调用Derived类的版本,而不是Base类的版本。但是,如果我们不在Derived类中重写show()函数,那么编译器会报错,因为Base类中的show()函数是虚函数,必须在派生类中重写。

纯虚函数

cpp 复制代码
#include <iostream>

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

class Derived : public Base {
public:
    void show() {
        std::cout << "Derived class function" << std::endl;
    }
};

int main() {
    Base* derivedPtr = new Derived();

    derivedPtr->show(); // 输出 "Derived class function"

    delete derivedPtr;

    return 0;
}

在这个例子中,Base类有一个纯虚函数show()。纯虚函数必须被重写,否则编译器会报错。在Derived类中,我们重写了show()函数,所以我们可以创建Derived类的实例并通过Base类的指针调用show()。如果我们不在Derived类中重写show()函数,那么编译器将报错,因为Base类中的show()函数是纯虚函数,必须在派生类中重写。

注意,纯虚函数通常用于抽象基类,它们不能直接实例化,只能作为其他类的基类。

通过基类的指针访问子类,调用虚函数,调用的都是子类的虚函数。 并不是子类一定无法访问基类的虚函数,可以通过域名作用符访问。

确实,当通过基类的指针访问子类对象时,如果基类中有一个虚函数被子类重写,那么通过该基类指针调用这个虚函数时,会调用子类的版本。但如果子类想要调用基类的虚函数版本,它可以通过使用基类名作为前缀(也称为作用域解析运算符)来明确指定要调用的是基类中的函数。

下面是一个简单的例子来说明这个概念:

cpp 复制代码
#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base class function" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class function" << std::endl;
    }

    void showBase() {
        Base::show();  // 调用基类中的show函数
    }
};

int main() {
    Derived d;
    Base* basePtr = &d;

    basePtr->show();  // 输出 "Derived class function"

    d.showBase();  // 输出 "Base class function"

    return 0;
}

在上面的例子中:

  1. 当我们通过基类指针 basePtr 调用 show() 函数时,输出的是 "Derived class function",因为 Derived 类重写了 Base 类的 show() 函数。
  2. 当我们在 Derived 类中调用 showBase() 函数时,我们通过 Base::show() 明确指定要调用的是基类中的 show() 函数,所以输出的是 "Base class function"。

这个例子展示了如何通过基类的指针访问子类,调用子类重写的虚函数,同时也展示了如何在子类中直接调用基类的虚函数。

相关推荐
羊小猪~~4 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^29 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城31 分钟前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德1 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz1 小时前
STL--哈希
c++·算法·哈希算法
kingmax542120081 小时前
初三数学,最优解问题
算法
一直学习永不止步1 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
小刘|2 小时前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou2 小时前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
van叶~2 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法