【C++ 多态】(一)虚函数重写✍

1.虚函数重写的三个例外

1.1协变(基类与派生类虚函数返回值类型不同)

①🍎协变的概念:

派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。

在这里插入图片描述

1.2析构函数的重写(基类与派生类析构函数的名字不同)

①🍎注意:如果派生类 new 出来了一个对象,申请了一段内存,必须重写子类的析构函数,并将基类的析构函数定义成为虚函数,不然子类申请的空间无法释放掉(内存泄露)。

子类的对象模型一部分是自己的,一部分是从父类继承的!所以析构的时候,“先子后父”(先把自己的释放再释放从父类继承的)❗

②🍎虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor

	 Person* p1 = new Person;
	 Person* p2 = new Student;

	 p1->destructor + operator delete(p1)
	 p2->destructor + operator delete(p2)
	 多态
	 问题❗:p1 和 p2 是什么类型,析构就调用什么类型(所以如果基类的析构函数不是虚函数的话,无法正确释放掉子类申请的空间,造成内存泄露)
	 
	 期望:指向父类调用父类析构
	 期望:指向子类调用子类析构
	 结论:建议析构函数定义为虚函数,防止发生内存泄漏

在这里插入图片描述
在这里插入图片描述

1.3派生类可以不写 virtual

①🍎重写只需要重写派生类的实现方式就好了(意思就是子类的函数名、函数参数、返回值类型用的是父类的),只重写函数体内部的实现!子类已经在语法上面继承下来了,所以重写实现就可以了。

2.面试题✍

做这道题目之前首先要弄清楚下面几个问题👇
①🍎两个 func() 构成虚函数重写吗?

构成虚函数的重写,子类的 virtual 将其省掉了。

②🍎test() 函数内部的 this 指针是指向 A* 还是 B*?
B*p = new B;p指向的是派生类,先在子类中查找有没有 test()函数,没有的话 ,就去父类查找,如果父类也没有的话,就会报错,所以派生类不是拷贝下来。

③🍎 虚函数重写,重写的是函数体的实现,函数体的结构部分(如函数名,函数参数,函数返回值)用的是父类的。

答案:B
在这里插入图片描述

在这里插入图片描述

  • 40
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我可以为您介绍一下关于C++多态虚函数的实验。 首先,多态是指不同对象以不同的方式响应相同的消息的能力。在C++中,通过虚函数来实现多态虚函数是指在基类中被声明为虚函数的函数,在派生类中被重写后,在程序中使用基类指针或引用调用该函数时,会调用派生类中的函数。 下面是一个简单的多态虚函数的实验示例: ```c++ #include<iostream> using namespace std; class Shape { public: virtual void draw() { cout << "Drawing Shape" << endl; } }; class Circle: public Shape { public: void draw() { cout << "Drawing Circle" << endl; } }; class Square: public Shape { public: void draw() { cout << "Drawing Square" << endl; } }; int main() { Shape *s; Circle c; Square sq; s = &c; s->draw(); s = &sq; s->draw(); return 0; } ``` 运行结果为: ``` Drawing Circle Drawing Square ``` 在上述示例中,我们定义了一个基类Shape和两个派生类Circle和Square,分别重写了基类的虚函数draw()。在程序中,我们先定义了一个基类指针s,然后将其指向第一个派生类对象c,再调用s的虚函数draw(),此时会调用派生类Circle的draw()函数,因为指针实际上指向的是Circle类型的对象。接着,我们将指针s重新指向第二个派生类对象sq,再次调用s的虚函数draw(),此时会调用派生类Square的draw()函数。 通过这个实验,我们可以看到多态虚函数的特性,即通过基类指针或引用调用虚函数时,会根据实际对象的类型来调用相应的派生类函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来可期LJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值