C++ 多态语法点

前置知识点

成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。
静态成员变量静态成员函数没有在类上存储。
非静态成员函数也不属于类的对象上

class Animal
{
	public:
	virtual void speak()
	{
		cout<<"动物在说话"<<endl;
	}

}

vfptr(virtual function table pointer)—虚函数(表)指针
指针指向虚函数表

vftable------虚函数表
表内记录虚函数的地址

C++ 多态语法点_第1张图片
如何记录呢,虚函数表内记录入口地址

&Animal:speak

如果直接继承,不重写父类的虚函数

C++ 多态语法点_第2张图片
会发生什么呢

C++ 多态语法点_第3张图片
子类会直接继承父类的虚函数表

如果重写父类的虚函数

当子类重写父类的虚函数,
子类的虚函数表内部会替换成子类的虚函数地址
而父类的虚函数表还是没有发生改变
C++ 多态语法点_第4张图片

当父类的指针或者引用指向子类对象的时候,就发生了多态

Animal& animal =cat;
animal.speak();

使用VS 2017的开发人员命令提示符工具进行验证

第一步:复制文件工程路径
C++ 多态语法点_第5张图片

第二步:跳转到复制的路径
C++ 多态语法点_第6张图片
第三步:查看有无 .cpp文件

C++ 多态语法点_第7张图片

第四步:输入c1 /d1 reportSingleClassLayoutAnima1 “01 多态基本概念.cpp
在这里插入图片描述

 
 
第五步:验证空类的所占内存空间为1
C++ 多态语法点_第8张图片

第六步:父类加上虚函数,而且子类不重写
验证父类此时所占内存空间为4,且存在虚函数指针
虚函数指针指向虚函数表,虚函数表内记录虚函数地址

C++ 多态语法点_第9张图片
C++ 多态语法点_第10张图片

 
 
第七步:子类不重写父类的虚函数,查看子类的存储,输入c1 /d1 reportSingleClassLayoutCat “01 多态基本概念.cpp

C++ 多态语法点_第11张图片

 
 

第八步:子类重写,输入c1 /d1 reportSingleClassLayoutCat “01 多态基本概念.cpp
C++ 多态语法点_第12张图片
C++ 多态语法点_第13张图片

你可能感兴趣的:(c++,开发语言)