IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 浅谈如何理解C++中的虚函数与纯虚函数 -> 正文阅读

[C++知识库]浅谈如何理解C++中的虚函数与纯虚函数

总所周知,虚函数是运行时的多态,虚函数只负责基类定义,而派生函数则进行重写实现。而纯虚函数就更为优秀了,只需要加个=0参数,就等于我定义了,派生类负责实现。我们先介绍虚函数再介绍纯虚函数。
虚函数一般分为虚函数成员与虚析构函数。

一般虚函数成员

虚函数成员就是指派生类对基类虚函数重新定义,但仍作为虚函数可在更下层派生类中重新定义。

#include<iostream>
using namespace std;
class Animal{
public:
    virtual void speak() {
        cout << "animal language!" << endl;
    }//虚函数成员
};

class Cat:public Animal{
public:
    virtual void speak(){
        cout << "cat language:miaomiao!" << endl;
    }//虚函数成员出现
};

int main()
{
    Cat cat;
    Animal *panimal = &cat;
    Animal &ref = cat;
    panimal->speak();
    ref.speak();
    return 0;

}

比如在这段程序里派生类就是对虚函数进行重新定义。毫无疑问答案就是。
在这里插入图片描述

虚析构函数

虚析构函数的出现就是基类指针指向派生类指针,如果基类指针被析构,顺便把派生类也析构的作用。

#include<iostream>
#include <cstring>

using namespace std;

class Animal{
public:
    Animal(char *name);
    void print_name();
    virtual void print_color();
    virtual void speak();
    virtual ~Animal();
private:
    char *m_pAnimalName;
};

Animal::Animal(char *name) {
    int len = strlen(name)+1;
    m_pAnimalName = new char[len];
    strcpy_s(m_pAnimalName,len,name);
}

Animal::~Animal() {
    cout << "Animal destructor!" << endl;
    if(m_pAnimalName){
        delete[] m_pAnimalName;
    }
}

void Animal::print_name() {
    cout << "name:" << m_pAnimalName << endl;
}

void Animal::print_color() {

}

void Animal::speak() {
}

class Cat:public Animal{
public:
    Cat(char* name,char* catcolor);
    virtual void print_color();
    virtual void speak();
    virtual ~Cat();
private:
    char *m_pCatColor;
};

Cat::Cat(char *name,char *color):Animal(name){
    cout << "Cat connstructor" << endl;
    m_pCatColor = new char[strlen(color) +1];
    strcpy_s(m_pCatColor, strlen(color)+1,color);

}
Cat::~Cat(){
    cout << "Cat destructor!" << endl;
    if(m_pCatColor){
        delete []m_pCatColor;
    }
}

void Cat::print_color() {
    cout << "cat color:" << m_pCatColor << endl;
}

void Cat::speak(){
    cout << "cat lanauge miaomiao!" << endl;
}

int main()
{
    Animal *p[2];
    int i;
    p[0] = new Cat("short_haired","white");
    p[0]->print_color();
    p[0]->print_name();
    p[0]->speak();
    p[1] = new Cat("Persian_cat","brown");
    p[1]->print_name();
    p[1]->print_color();
    for(i=0;i<2;i++)
        delete p[i];

    return 0;

}

在这里插入图片描述

比如在这段程序里,纯虚函数,就是在啊析构的时候一并析构了。

纯虚函数

纯虚函数就是将基类的虚函数增加一个=0,实现就在派生类实现即可。

virtual void print_color()=0;
#include<iostream>
#include<cstring>
using namespace std;

class Animal{
public:
    Animal(char *name);
    void print_name();
    virtual void print_color() = 0;
    virtual ~Animal();
private:
    char *m_pAnimalName;
};

Animal::Animal(char *name) {
    int len = strlen(name)+1;
    m_pAnimalName = new char[len];
    strcpy_s(m_pAnimalName,len,name);
}

Animal::~Animal() {
    cout << "Animal destructor!" << endl;
    if(m_pAnimalName){
        delete []m_pAnimalName;
    }
}

void Animal::print_name() {
    cout << "name:" << m_pAnimalName << endl;
}

class Cat:public Animal{
public:
    Cat(char *name,char *catcolor);
    virtual void print_color();
    virtual ~Cat();
private:
    char *m_pCatColor;

};

Cat::Cat(char *name,char *color): Animal(name){
    cout << "Cat constructor!" << endl;
    m_pCatColor = new char[strlen(color) +1];
    strcpy_s(m_pCatColor,strlen(color) + 1,color);
}

Cat::~Cat(){
    cout << "Cat destructor!" << endl;
    if(m_pCatColor) {
        delete []m_pCatColor;
    }
}
void Cat::print_color() {
    cout << "cat color:" << m_pCatColor << endl;
}

int main()
{
    Animal *p;
    p = new Cat("short_cat","white");
    p->print_name();
    p->print_color();
    cout << "----------------" << endl;
    delete p;
    return 0;

}

在这里插入图片描述

基类声明,派生类进行重定义。

总结

虚函数分为一般虚函数成员与虚析构函数。其中虚一般成员函数就是基类定义,派生类进行重定义用的,而虚析构函数就是指基类指针指向派生类指针,如果基类指针指向派生类new分配,基类指针析构,派生类无法析构的问题。而纯虚函数就是只是提供函数接口,派生类根据给出具体实现。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 15:53:52  更:2022-01-03 15:55:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:09:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码