首页 > 其他分享 >多态(一)

多态(一)

时间:2023-08-10 17:38:29浏览次数:33  
标签:调用 函数 子类 多态 Person 析构

多态

多态就是多种形态,具体点就是当不同的对象去完成时会产生不同的状态。

virtual加在一个虚函数的前面,我们叫做虚函数。

虚继承和虚函数没有关系。

函数名相同,参数列表相同他们叫做重写或者覆盖,这里没有重载的关系,重载必须在同一个作用域。

#include <iostream>
using namespace std;
class Person {
public:
	virtual void Buyticket()
	{
		cout << "买票-全价" << endl;
	}
};
class Student :public Person {
public:
	//重写/覆盖
	virtual void Buyticket()
	{
		cout << "买票-半价" << endl;
	}
};
void Func(Person& p)
{
	p.Buyticket();
}
int main()
{
	Student s;
	Person p;
	Func(s);
	Func(p);
	return 0;
}

构成多态以后传父类调用的是父类的虚函数,传子类调用的是子类的虚函数。

Func函数参数中既可以传父类的对象也可以传子类的对象。

多态的两个条件:1.虚函数的重写,三同(函数名、参数、返回值);2.父类的指针或者引用去调用。

那当我们不使用指针或者引用的时候能不能调用?不能。

image-20230421092937493

我们来看一下,有些情况没有多态不行

class Person {
public:
	~Person()
	{
		cout << "~Person" << endl;

	}
};
class Student :public Person {
public:
	//重写/覆盖
	~Student() {
		cout << "~Student" << endl;
}
};

int main()
{
	Person p;
	Student s;
	return 0;
}

image-20230421093316392

没有虚函数的情况下运行结果如上,

当我们更换为

int main()
{
	/*Person p;
	Student s;*/
	Person* ptr1 = new Person;
	Person* ptr2 = new Student;

	delete ptr1;
	delete ptr2;
	return 0;
}

运行结果如下:

image-20230421093526645

指向子类的析构函数调用的还是父类的析构函数,如果子类中有一些资源释放,没调用到会导致一些内存泄漏。

析构函数会被重命名为destructor,所以构成隐藏,谁的指针就调用谁的析构函数:image-20230421093852312

标签:调用,函数,子类,多态,Person,析构
From: https://blog.51cto.com/u_15562309/7037759

相关文章

  • Java三大特性之--多态基础
    半年前学的已经忘了,现在来复习一下。。。1、多态的一个小例子 publicclassPolyObject{publicstaticvoidmain(String[]args){//体验对象多态特点//animal编译类型就是Animal,运行类型DogAnimalanimal=newDog();//因为运行时,执行到改行时,animal运行......
  • C++ 多态深入解析
    @TOC前言在C++编程中,多态性(Polymorphism)是一种重要的概念,它允许基于对象的实际类型来调用不同的函数。多态性提供了灵活性和可扩展性,使得代码更易于维护和扩展。一、什么是多态多态性的定义:多态性是一种面向对象编程的特性,它允许使用基类的指针或引用来调用派生类对象的特定成员函......
  • JavaSE--多态在开发中的作用
    一、多态在开发中的作用  1、降低程序的耦合度,提高程序的扩展力  publicclassMaster(){    publicvoidfeed(Dogd){}    publicvoidfeed(Dogd){}  }  以上代码中:Master和Dog、Cat关系紧密,耦合度高,导致扩展力很差  publicclassMaster(){   ......
  • JavaSE--方法覆盖和多态
    一、方法覆盖Override1、什么时候使用Override  例如:以下代码:鸟儿在执行move方法时,最好输出“鸟儿在飞翔”,但是当前程序在执行move方法时,输出“动物在移动”,显然Bird子类继承来的方法无法满足需求  子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,子类有权......
  • C++类和对象_多态
    虚函数被virtual修饰的成员函数被称为虚函数,虚函数的地址会被纳入类的虚函数表(virtualfunctiontable)。inline和virtual不会同时生效,用virtual修饰内联函数时,编译器会忽视函数的内联属性,此时函数不再是内联。虚函数一定不是内联函数。虚函数的重写子类继承父类,并有一个与父类......
  • 1-3 多态、模板
    1多态多态分两类:静态多态:函数重载和运算符重载,即复用函数名动态多态:派生类和虚函数来实现运行时多态区别:静态多态在编译阶段确定函数地址动态多态在运行阶段确定函数地址,根据传入的对象不同确定具体的执行函数动态多态满足条件:首先要有继承关系子类要重写父类的虚......
  • 封装、继承、多态及重载
    1.封装​封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,避免了外界直接访问对象属性而造成耦合度过高及过度依赖,同时也阻止了外界对对象内部数据的修改而可能引发的不可预知错误。例子1:封装后通过实例化来访问类里边的变量例子2:封......
  • 第十节 多态练习
    需求 1.定义狗类 属性: 年龄,颜色 行为: eat(Stringsomething)(something表示吃的东西) 看家lookHome方法(无参数) 2.定义猫类 属性: 年龄,颜色 行为: eat(Stringsomething)方法(something表示吃的东西) 逮老鼠catchMouse方法(无参数) 3.定义Person......
  • 第十六节 面向对象进阶(多态&包&final&权限修饰符&代码块)
    今日内容多态包final权限修饰符代码块教学目标能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型能够知道多态的使用场景包的作用public和private权限修饰符的作用描述final修饰的类的特点描述final修饰的方法的特点......
  • 进程,线程和协程;为什么有了GIL锁还要互斥锁;多态和多态性;鸭子类型
    进程,线程和协程;为什么有了GIL锁还要互斥锁;多态和多态性;鸭子类型为什么有了GIL锁还要互斥锁1.GIL本身就是一个大的互斥锁2.同一个进程下资源是共享的,也就是说多条线程可以操作同一个变量3.多个线程可以操作同一个变量就会出现数据安全问题4.临界区:指一段代码或一段程序片段,需......