iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++虚函数和多态超详细分析
  • 805
分享到

C++虚函数和多态超详细分析

C++虚函数和多态C++虚函数C++多态 2023-01-28 06:01:48 805人浏览 薄情痞子
摘要

目录1.什么是虚函数2.纯虚函数3.c++多态4.纯虚函数和ADT过程5.虚析构函数6.dynamic_cast类型转换7.成员函数指针 1.什么是虚函数 C++类中用virtual

1.什么是虚函数

C++类中用virtual修饰的函数叫做虚函数,构造函数没有虚构造函数,存在虚析构函数,C++所有虚函数都是一个指针去存储的,所以具有虚函数的类,内存会增加一个指针大小的内存

#include<iOStream>
#include<string>
using namespace std;
class MM
{
public:
	//虚函数指针是同一个,所以无论该类中有多少个虚函数,
	//占用的内存就只是一个指针的大小
	virtual void print()
	{
		cout << "我是第一个虚函数" << endl;
	}
	virtual void printData() 
	{
		cout << "我是第二个虚函数" << endl;
	}
protected:
};
class son:public MM
{
public:
	void print() 
	{
		//该函数也是虚函数,
        //父类中同名函数是虚函数
		//所以子类该函数也是虚函数
	}
protected:
};
int main() 
{
	cout << sizeof(MM) << endl;
	cout << "...................." << endl;
	//虚函数表的理解,下面带图解
	MM mm;
	long long** p = (long long**)&mm;
	using Func = void(*)();
	Func f1 = (Func)p[0][0];
	Func f2 = (Func)p[0][1];
	f1();
	f2();
	return 0;
}

2.纯虚函数

纯虚函数也是虚函数的一种,只是没有函数体,下面请看怎么表示没有函数体

纯虚函数——>虚函数=0;

具有一个或者多个虚函数的类叫做抽象类

  • 抽象类不能构建对象
  • 但是可以构建函数指针
#include<iostream>
using namespace std;
class MM
{
public:
	virtual void print() = 0;
};
int main()
{
	//MM mm; //抽象类不能构建对象
	MM* pmm = nullptr;
	return 0;
}

3.c++多态

多态指的是因为指针的不同的赋值操作所导致的同一行为的不同结果。多态的这个概念东西不太重要,重要的是什么样的情况调用什么样的行为

  • 正常指针和正常对象调用行为,就近原则
  • 父类指针被子类对象初始化
  • 函数有virtual看对象类型
  • 函数没有virtual看指针类型
  • final关键字 禁止子类重写父类方法
  • override显示说明当前函数是重写函数

多态三个必要性条件:

  • 父类中存在虚函数
  • 存在不正常指针的引用(不正常赋值关系)
  • public继承
#include<iostream>
using namespace std;
class MM
{
public:
	void print()
	{
		cout << "父类" << endl;
	}
	virtual void printData()
	{
		cout << "MM" << endl;
	}
};
class son :public MM 
{
public:
	void print() 
	{
		cout << "子类" << endl;
	}
	void printData() 
	{
		cout << "son" << endl;
	}
};
int main()
{
	MM* pmm = new son;
	pmm->print();
	pmm->printData();
	return 0;
}

4.纯虚函数和ADT过程

ADT:abstract data type抽象数据类型,主要是通过继承抽象类中,子类必须要实现父类的抽象方法,子类才可以创建对象。

#include<iostream>
#include<string>
using namespace std;
class data
{
public:
	string name;
	int age;
};
class MM
{
public:
	virtual bool empty() = 0;
	virtual int size() = 0;
};
class List:public MM
{
public:
	bool empty()
	{
		return 0;
	}
	int size()
	{
		return NULL;
	}
};
int main()
{
	MM* pmm = new List;
	pmm->empty();
	pmm->size();
}

5.虚析构函数

virtual修饰的析构函数就是虚析构函数,当存在子类对象初始化父类指针的时候,父类析构函数就要是虚析构函数,否则只会释放父类,存在内存泄漏问题

#include<iostream>
using namespace std;
class MM
{
public:
	virtual ~MM()
	{
		cout << "父类" << endl;
	}
};
class son:public MM
{
public:
	~son()
	{
		cout << "子类" << endl;
	}
};
int main()
{
	MM* pmm = new son;
	delete pmm;
	return 0;
}

6.dynamic_cast类型转换

  • 上行转换 子类到父类 和staic_cast差不多
  • 下行转换 父类到子类 dynamic_cast更为安全
  • 交叉转换 多继承
#include<iostream>
using namespace std;
class MM
{
public:
	virtual void print() { cout << "MM" << endl; }
};
class son:public MM
{
public:
	void print() { cout << "son" << endl; }
};
class A
{
public:
	virtual void print(){}
};
class B
{
public:
	virtual void print() {}
};
class C:public A,public B
{
public:
	void print()
	{
		cout << "c" << endl;
	}
};
int main()
{
	MM* partent = new MM;
	son* Son = new son;
	//上行转换----->没有必要
	MM* p = static_cast<MM*>(Son);
	MM* pp = dynamic_cast<MM*>(Son);
	MM* ppp = Son;       //可以
	//下行转换
	son* x = dynamic_cast<son*>(partent); //安全,父类没有virtual会报错---->多态
	if(!x)
	{
		printf("error");
	}                           //下行转换不安全,不会申请成功
	A* a = new A;
	B* b = dynamic_cast<B*>(a);
	b->print();
	return 0;
}

7.成员函数指针

#include<iostream>
#include<functional>
using namespace std;
class MM
{
public:
	void print() { cout << "king" << endl; }
	static void printData() { cout << "MM" << endl; }
};
int main()
{
	void(*p)() = &MM::printData;
	p();
	//必须通过对象调用
	void(MM::*pp)() = &MM::print;
	MM mm;
	(mm.*pp)();
	//函数适配器,让函数调用形态可以适用于别的形态
	auto f = bind(&MM::print, &mm);
	f();
	return 0;
}

到此这篇关于C++虚函数和多态超详细分析的文章就介绍到这了,更多相关C++虚函数和多态内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++虚函数和多态超详细分析

本文链接: https://www.lsjlt.com/news/178240.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++虚函数和多态超详细分析
    目录1.什么是虚函数2.纯虚函数3.c++多态4.纯虚函数和ADT过程5.虚析构函数6.dynamic_cast类型转换7.成员函数指针 1.什么是虚函数 C++类中用virtual...
    99+
    2023-01-28
    C++虚函数和多态 C++虚函数 C++多态
  • C++的多态和虚函数实例分析
    这篇文章主要介绍了C++的多态和虚函数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++的多态和虚函数实例分析文章都会有所收获,下面我们一起来看看吧。一、C++的面试常考点阿里虽然是国内Java的第一...
    99+
    2023-06-29
  • C++ 超详细分析多态的原理与实现
    目录多态的定义及实现多态的构成条件虚函数重写C++11的override和final抽象类多态的原理虚函数表动态绑定与静态绑定单继承和多继承关系的虚函数表单继承中的虚函数表多继承中的...
    99+
    2024-04-02
  • C++超详细分析讲解内联函数
    目录宏函数(带参数的宏)的缺点inline修饰的函数就是内联函数内联函数的特点宏函数和内联函数的区别宏函数(带参数的宏)的缺点 第一个问题:宏函数看起来像一个函数调用,但是会有隐藏一...
    99+
    2024-04-02
  • C++超详细分析函数重载的使用
    目录一、函数重载分析(上)1.1 重载的定义1.2 函数重载的定义1.3 函数重载需要满足的条件1.4 编译器调用重载函数的准则1.5 函数重载的注意事项1.6 小结二、函数重载分析...
    99+
    2024-04-02
  • C++超详细讲解析构函数
    目录特性析构函数处理自定义类型编译器生成的默认析构函数特性 析构函数是特殊的成员函数 特征如下: 析构函数名是~类名;无参数无返回值;一个类有且只有一个析构函数;对象声明周期结束,编...
    99+
    2024-04-02
  • Python构造函数与析构函数超详细分析
    目录1.构造函数2.析构函数1.构造函数 __init__(self), 这个方法就是构造函数,在实例化的时候自动调用。 所有如果这个函数内有打印的方法,当实例出来的时候会打印里面的...
    99+
    2022-11-13
    Python构造函数与析构函数 Python析构函数 Python构造函数
  • C++虚函数表与多态实例代码分析
    这篇文章主要介绍“C++虚函数表与多态实例代码分析”,在日常操作中,相信很多人在C++虚函数表与多态实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++虚函数表与多态实例代码分析”的疑惑有所帮助!...
    99+
    2023-07-05
  • C语言超详细解析函数栈帧
    目录一、前面二、预备知识三、栈帧创建与销毁四、总结一、前面 本章将以汇编视角看函数栈帧的内存是如何使用与回收的,为了降低汇编语言的理解成本,以图示的方式讲解每一步汇编指令所带来的效果...
    99+
    2024-04-02
  • C++超详细分析顺序表
    本次我们解剖顺序表将从以下三个结构: 1、静态顺序表和动态顺序表 2、顺序表实现增删查改等常见接口 3、顺序表相关OJ题练习 什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存...
    99+
    2024-04-02
  • C++超详细分析红黑树
    目录红黑树红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入操作情况一情况二情况三红黑树的验证用红黑树封装map、set红黑树的迭代器封装map封装set红黑树 红黑树的概念 红黑...
    99+
    2024-04-02
  • 超级详细讲解C++中的多态
    目录多态概念引入1、C++中多态的实现1.1 多态的构成条件1.2 虚函数1.3虚函数的重写1.4 C++11 override && final1.5 重载,覆盖(...
    99+
    2024-04-02
  • 深入解析C++中的虚函数与多态
    1.C++中的虚函数C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类...
    99+
    2022-11-15
    虚函数 多态
  • C++学习之虚函数表与多态详解
    目录概述C++虚函数表指针和虚函数表C++ 虚函数表和多态概述 C++的多态在不同环境下实现方式可能不一样,虚函数表是C++实现多态的一种方式。 问题: 什么情况下C++会使用虚指针...
    99+
    2023-05-14
    C++虚函数表 多态 C++虚函数表 C++ 多态
  • C++多态特性之派生与虚函数与模板详细介绍
    目录继承与派生虚函数父类代码如下模板函数模板类模板字符串继承与派生 C ++ 是面向对象编程,那么只要面向对象,都会有多态、继承的特性。C++是如何实现继承的呢? 继承(Inheri...
    99+
    2024-04-02
  • 超详细分析C语言动态内存管理问题
    目录一、为什么存在动态内存的分配二、动态内存函数的介绍2.1 malloc和free2.2 calloc2.3 realloc三、常见的动态内存错误3.1 对NULL指针的解引用操作...
    99+
    2024-04-02
  • 深入解析C++中多态性和虚函数使用原理
    目录1.为什么需要virtual2.纯虚函数和抽象类3.构造函数与虚函数4.虚析构函数与纯虚析构函数5.纯虚析构函数的应用1.为什么需要virtual 按照Java的思维方式,在有了...
    99+
    2023-05-20
    C++ 多态性虚函数 C++ 多态性 C++ 虚函数
  • C++超详细讲解函数对象
    目录一、客户需求二、存在的问题三、解决方案四、函数对象五、小结一、客户需求 编写一个函数 函数可以获得斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用 下面来看第一个...
    99+
    2024-04-02
  • C++超详细讲解构造函数
    目录类的6个默认成员函数构造函数特性编译器生成的默认构造函数成员变量的命名风格类的6个默认成员函数 如果我们写了一个类,这个类我们只写了成员变量没有定义成员函数,那么这个类中就没有函...
    99+
    2024-04-02
  • C++超详细讲解函数重载
    目录1 函数重载的定义2 构成函数重载的条件3 编译器调用重载函数的准则4 函数重载的注意事项4.1 避开重载带有指定默认值参数的函数4.2 注意函数重载遇上函数指针4.3 C++编...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作