最直观的c++虚函数入门讲解,包看包会

最直观的c++虚函数入门讲解,包看包会,第1张

        最近也是到了期末考试,准备复习c++面向对象设计了,老师讲虚函数的时候摸了🐟,导致现在有点不大理解,网上搜寻了一些资料以后整理了一点我个人觉得比较直观的代码。

首先虚函数是什么?为什么要有虚函数?搞懂这一点之前首先要理解类与对象中的多态和继承。

子类在继承父类的同时,公有方法都会被继承,那么总会有一个大大的问题:“父类和子类的同名函数产生二义性了!”

是的,打个比方,首先父亲继承给儿子一套房,但是儿子自己有一套房,当你说儿子的房子需要装修的时候,这时候产生了二义性,你说的究竟是哪一套房子呢?是父亲给的,还是儿子自己买的?在这里,子类中同名函数调用也就产生了歧义。

针对这现象,c++提供了虚函数这一概念!用virtual关键字来命名函数,即在父类中声明好一个虚函数,这时候会产生一个虚函数表,这个虚函数表看书上网上都会说在ptr指针指向的vptr指针什么什么的,对于初学者而言,有一点摸不着头脑。

初浅理解是:当父类拥有虚函数的时候,这个虚函数在本来的父类中不会有任何的歧义,和正常函数一样使用。而子类在继承父类的时候,这个虚函数表也一并继承了下来,如若遇到同名函数,虚函数表里的父类的同名函数就会被覆盖掉。

这里就有重点了,根据c++特性,派生类是可以给基类赋值的。原因是继承的内核是在构造子类对象的时候会在子类对象中产生一个匿名的父类对象,这其实也是继承的内核,而我们所学的三种(public,project,private)就是在子类中产生了一个对应的匿名父类对象而已。

而在子类给父类赋值的时候,就是将这个匿名对象的值,浅拷贝给父类对象,同时子类的虚函数表也会同时一并传给父类对象。

光说肯定没那么清晰的,大家看一看代码就很清楚了!

#include
using namespace std;
class A{		
	public:
		A(string s):c(s)
		{
		}
		virtual void show(){
			cout<show();
	
	cout<<"a1的虚函数表首地址:"<<*(int*)(a1)<show();
	cout<<"b1的虚函数位于对象:";
	b1.show();
	cout<<"a2的虚函数位于对象:";
	a2.show();
	return 0;
} 

而运行结果如下:

 

 这里我只写了一个虚函数,以所以首地址就是该函数的地址!

最后说一句,千万别摸🐟,呜呜呜~~

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/920821.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-16
下一篇2022-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存