首页 > 编程语言 >C++ 面向对象编程:多态、虚函数原理

C++ 面向对象编程:多态、虚函数原理

时间:2025-01-03 22:58:04浏览次数:7  
标签:ami include cout 多态 C++ 面向对象编程 父类 函数

多态的通用描述便是,使用父类指针调用函数,可以根据对象类型来调用对应类型函数,我们分几个步骤来理解,先看下类的占用空间,然后拓展到虚函数对应数组,最后理解多态的原理。

我们先来看下在多态中没有任何成员变量的类大小为多大,其实如果没有任何成员变量的话,他大小按理说来应该是零,但是为了限制无限创建类,还是需要用一个占位符,见以下代码:

#include<iostream>
using namespace std;

class ami {
public:
	void eat() {
		cout << "动物吃。。" << endl;
	}
};

class cat1 : public ami{
public:
	void eat() {
		cout << "咪咪吃。。" << endl;
	}
};

void eat(ami& m) {
	m.eat(); //3
}

void Test() {
	cat1 d; 
	eat(d); // 2
	cout << "ami size is " << sizeof(ami) << endl;
}

int main() {
	Test();// 1
	return 0;
}

运行结果见下:

从监视也可以看出,确实没有保存内容,只是提供一个占位

如果是加上虚函数,我们再来看下类的大小

#include<iostream>
using namespace std;

class ami {
public:
	virtual void eat() {
		cout << "动物吃。。" << endl;
	}
};

class cat1 : public ami{
public:
	void eat() {
		cout << "咪咪吃。。" << endl;
	}
};

void eat(ami& m) {
	m.eat(); //3
}

void Test() {
	cat1 d; 
	eat(d); // 2
	cout << "ami size is " << sizeof(ami) << endl;
}

int main() {
	Test();// 1
	return 0;
}

看下运行结果

我们再来看下监视的内容,这里的八个字节其实是虚函数指针,这个指向一个数组首地址,由虚函数组成的数组:

我们再看另一种情况

#include<iostream>
using namespace std;

class ami {
public:
	virtual void eat() {
		cout << "动物吃。。" << endl;
	}
	virtual void run() {
		cout << "动物跑。。" << endl;
	}
};

class cat1 : public ami{
public:
	void eat() {
		cout << "咪咪吃。。" << endl;
	}
};

void eat(ami& m) {
	ami f;
	m.eat(); //3
}

void Test() {
	cat1 d; 
	eat(d); // 2
	cout << "ami size is " << sizeof(ami) << endl;
}

int main() {
	Test();// 1
	return 0;
}

我们来看下监视的内容:

如果是继承的时候,子类覆盖掉父类对应的虚函数即可,换句话说,子类在继承父类函数时,直接到虚函数列表中去找,直接找已经覆盖掉的父类函数。这个也是为啥说会产生一个虚函数列表,这个是为了方便多态。这个便是多态的原理,直接从数组中找对应函数(并且是已经覆盖了的父类函数)。

标签:ami,include,cout,多态,C++,面向对象编程,父类,函数
From: https://blog.csdn.net/qq_43355454/article/details/144896462

相关文章

  • 【华为OD-E卷 - 组合出合法最小数 100分(python、java、c++、js、c)】
    【华为OD-E卷-组合出合法最小数100分(python、java、c++、js、c)】题目给一个数组,数组里面哦都是代表非负整数的字符串,将数组里所有的数值排列组合拼接起来组成一个数字,输出拼接成的最小的数字输入描述一个数组,数组不为空,数组里面都是代表非负整数的字符串,可以是0开头,......
  • 04-c++类和对象(下)
    一、友元前面学习的类中,只能通过该类的公共方法访问私有数据。而如果将某个函数设置为类的友元,那么这个函数就可以直接访问该类的私有数据,破坏了类的封装性,只在某些特定的情况下使用。友元的分类:普通全局函数作为友元、类的某个成员函数作为友元、整个类作为友元。关键字:f......
  • 03-C++类和对象(中)
    一、初始化列表1.对象成员对象成员即一个类的对象作为另外一个类的成员。代码演示classA{private:inta;public:A(){a=0;cout<<"A的无参构造被调用"<<endl;}A(inta1){a=a1;cout<<"A......
  • 03-C++类和对象(上)
    一、类的概述1.类的引入类的封装:将数据和方法封装在一起,加以权限区分,用户只能通过公共方法访问私有数据。为什么要将数据和方法封装在一起呢,而且还要通过公共方法才能访问私有数据?C语言中数据和方法分开可能产生的问题://定义一个狗结构体structDog{charname[......
  • C++程序运行的三种方式
    一、例程编一个程序,计算机随机产生一个整数(1至5),自己输入一个整数,若两数相同,则输出“恭喜你,中奖了!奖金10元”,否则输出“没中奖,请付费2元”;同时公布中奖号码。#include<iostream>#include<cstdlib>//要用到定义在其中的rand()、srand()函数#include<ctime>//......
  • C++期末总复习last day 20250103
    内容主体来自于QJH先生,向其表示敬意。C++高级程序设计题目类型简述题(5题、25分)什么是数据抽象与封装?相比于过程抽象与封装,数据抽象与封装有什么好处?……(不用死记硬背)程序分析题(5题、40分)指出下面程序的错误和错误原因写出下面程序的运行结果。写出下面程序的运行......
  • C++课程设计,c++餐厅管理系统
    本系统主要只用于c++课程设计、毕业设计。其功能如图:(每个功能执行后都可返回初始页面继续选择执行功能)1.信息查询:餐厅信息、服务员信息、菜单信息、查看评价(1)查询餐厅信息:(2)查询服务员信息:(3)查询菜单:(4)查看评价:2.信息录入:(1)添加菜品信息:包括菜品的编号、名称、价格......
  • C++中的数组与指针
    在大多数C++书籍或教程中,数组和指针的知识总是放在一起让大家学习,这是为什么,它们之间有什么联系呢?在C++中,数组与指针有着紧密的联系,主要体现在下面几个方面:1、数组名即指针:本质联系:在大多数情况下,数组名会被隐式转换为指向数组第一个元素的指针。例如,对于一个数组intarr[5];......
  • 14C++循环结构-while循环(1)
    一、while语句问题:试编一程序,在屏幕上输出1~5这几个数字。今天,我们用while语句来编写这个程序。while语句的特点是先判断表达式,后执行语句。其一般形式为:while(表达式)语句;当表达式的值为真(非0)时,就不断地执行循环体内的语句,所以while循环称为当型循环。while语句的执行过程......
  • 用c++实现四阶龙格库塔方法求解常微分方程
    `#includeusingnamespacestd;doublefunc(doublex,doubley)//自定义函数{if(x==0)return1;returny-(2*x)/y;}void龙格库塔(doublea,doubleb,intn)//a~b范围内的函数求值,n为求值的次数;{//初始化doubleK[4]={0.0,0.0,0.0,0.0};doubleh=(b......