栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++57个入门知识点

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++57个入门知识点

前面介绍了虚函数是以间接引用的方式实现“不同国家的人说不同语言”的功能,本篇对其过程进行了模拟实现。
1.步骤总结:

//(1)找到对象头部四个字节--虚表
//(2)根据虚函数的位置(在cpp中定义的顺序),确定该虚函数在虚表的下标
//(3)找到对应的虚函数地址,直接调用该地址

用下图也可以看出

2.学习视频地址:虚函数的模拟实现
3.学习笔记
(1)整体结构如下图:

(2)Chinese.h/cpp

Chinese

#pragma once
#include 
#include "Person.h"
class CChinese :public CPerson {
public:
	CChinese() {
		m_pVirTable = m_ChsTable;
	}
	~CChinese() {

	}
	 void speak() {
		printf("Speak Chinese!");
	}

	 //每一个类有自己的虚表
	 static PEN_VIRTUAL m_ChsTable[2];
};


Chinese.cpp

#include "Chinese.h"
//函数覆盖
PEN_VIRTUAL CChinese::m_ChsTable[2] = { (PEN_VIRTUAL)&CChinese::speak, (PEN_VIRTUAL)&CPerson::eat };

(3)English.h/cpp
English.h

#pragma once
#include 
#include "Person.h"
class CEnglish :public CPerson {
public:
	CEnglish() {
		m_pVirTable = m_EngTable;
	}
	~CEnglish() {

	}

	void speak() {
		printf("Speak English");
	}
	void eat() {
		printf("Eat English");
	}

	//每一个类有自己的虚表
	static PEN_VIRTUAL m_EngTable[2];
};

English.cpp

#include "English.h"
//函数覆盖
PEN_VIRTUAL CEnglish::m_EngTable[2] = { (PEN_VIRTUAL)&CEnglish::speak, (PEN_VIRTUAL)&CEnglish::eat };

(4)Person.h/cpp
Person.h

#pragma once
#include 

class CPerson;//向前声明

//定义一个函数指针
typedef void(CPerson::*PEN_VIRTUAL)();

class CPerson
{
public:
	CPerson() {
		m_pVirTable = m_Table;
	}
	~CPerson() {

	}

	 void speak() {
		printf("Just Speak!");
	}

	 void eat() {
		 printf("Just Eat!");
	 }

	 //模拟虚表指针(数组的指针)
	 PEN_VIRTUAL* m_pVirTable;//PEN_VIRTUAL代表函数指针

	 //静态成员来表示真正的虚表,用来表示同一个类的虚表是一样的
	 static PEN_VIRTUAL m_Table[2];
};

Person.cpp

#include "Person.h"
PEN_VIRTUAL CPerson::m_Table[2] = {&CPerson::speak,&CPerson::eat};

(5)testCPP.cpp

#include 
#include "Person.h"
#include "English.h"
#include "Chinese.h"


int main(int argc,char* argv[])
{
	CPerson* pPer[2];
	CPerson per;

	CChinese chs;
	int nChsLength = sizeof(chs);

	CEnglish eng;
	int nEngLength = sizeof(chs);

	//把子类指针转给父类
	pPer[0] = &chs;
	pPer[1] = ŋ

	for (int i = 0; i < 2; i++)
	{
		//(pPer[i]->*pPer[i]->m_pVirTable[0])();//获取虚表指针,等效为下面几步
		//等价于:
		//(1)找到对象头部四个字节--虚表
		PEN_VIRTUAL* pVirTable = pPer[i]->m_pVirTable;
		//(2)根据虚函数的位置(在cpp中定义的顺序),确定该虚函数在虚表的下标
		PEN_VIRTUAL pfn = pVirTable[1];
		//(3)找到对应的虚函数地址,直接调用该地址
		//pPer[i]->speak();//间接调用
		(pPer[i]->*pfn)();

		printf("rn");
	}

	return 0;
}


4.运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/396277.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号