C++:多态和虚函数

多态

    • 一、静态绑定和动态绑定
    • 二、虚函数
    • 三、多态
    • 四、代码实现
      • 4.1 父类定义
      • 4.2 子类实现
      • 4.3 多态使用
      • 4.4 结果

一、静态绑定和动态绑定

静态绑定

  • 在函数声明时,就已经将对应的函数体绑定在一起,类外的类使用域区分符定义的也是静态绑定。

动态绑定

  • 相当于只声明了一个函数,但是函数体并没有进行绑定,编译器依旧不知道需要执行什么代码,只知道存在这个函数。

二、虚函数

定义: 虚函数是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。

纯虚函数: virtual void funtion1()=0; 虚函数一定没有函数体,函数体一定是在子类重写时声明,且虚函数必须要实现

  • 虚函数作用:
    • 将普通类转变成抽象类,相当于对类转变成接口
    • 核心观点是规范和约束编程,提高统一的接口访问

三、多态

多态意义: 多态字面意思是多种形态,多种形态的来源便是继承所带来的,子类可以继承父类的public和protected方法,但是子类本身是对父类的继承和扩充,即“青出于蓝而胜于蓝”,这就是多态存在的意义。

四、代码实现

4.1 父类定义

class person {
	// 默认的成员变量都是私有的
	private:
		string ID;

	protected:
		int age;
		int height;
		string sex;

	public:
		// 无参数的构造函数,构造函数也可以在类外进行定义函数体
		person() {
			cout << "this object is being created." << endl;
		}
		
		// 析构函数,不会返回任何值,也不带任何参数,可以在销毁当前对象时,关闭文件、释放内存
		~person()
		{
			cout << "this object is being destoryed." << endl;
		}

		// 多态使用的函数,需要被重写
		// 需要使用虚函数,虚函数告诉编译器,此函数是动态链接的,在执行调用时才将函数体与函数名进行绑定
		// 如果不使用虚函数声明,那么这个函数就是静态链接,做了静态绑定
		virtual void walk() {
			cout << "person can walk." << endl;
		}

4.2 子类实现

class student : public person {
	private:
		string num;
		int grade;	// 用数字表示年级

	public:
		// 父类中protected修饰的变量,public和protected继承的子类可以直接使用,否则需要调用相应的函数
		
		// 多态重写父类的walk方法
		void walk() {
			cout << "student can walk." << endl;
		}
};

class cook : public person {
	public:
		// 多态重写父类的walk方法
		void walk() {
			cout << "cook can wolk" << endl;
		}
};

4.3 多态使用

void	duotai_test() {
	person *p;
	student s;
	cook c;
	
	p = &s;
	p->walk();

	p = &c;
	p->walk();
}

4.4 结果

C++:多态和虚函数_第1张图片

你可能感兴趣的:(C/C++,c++)