虚函数
1 . 静态多态 : 在编译时 , 就可以确定函数调用的地址 ; 上面 多态 中的示例就是静态多态示例 ;
下面的虚函数的示例 , 是动态多态示例 ;
2 . 动态多态 : 在运行时 , 确定函数调用地址 , 这里就用到虚函数 ;
3 . 虚函数作用 : 让函数调用的地址 , 在运行时确定调用哪个函数 ;
4. 虚函数解析 : 在对象调用虚函数方法时 , 系统会查看该对象真正类型是什么类型 , 然后去调用对应类型的方法 ; 对象是使用什么类型的构造函数创建的 , 其真正的类型就是这个类型 , 因此最终调用该类中的虚函数方法 ;
5. 虚函数使用要点 :
1. 构造方法 : 不能设置成虚函数, 如果将构造方法设置成虚函数 , 编译时会报错 ;
2. 析构方法 : 必须设置成虚函数 , 释放子类对象内存时 , 必须释放子类对象的内存 , 否则子类对象的内存永远不会被释放 ;
3. 没有子类 : 虚函数在子类继承父类时才有意义 , 根据类型动态判定该调用哪个方法 , 如果一个类没有子类 , 其设置成虚函数没有意义 , 但也不影响程序运行 ;
虚函数示例
虚函数代码示例解析 :
1. 父类中定义虚函数 :
//父类 class Parent{ public: void parent_method() { cout << " Parent parent_method " << endl; } //虚函数 virtual void virtual_method() { cout << " Parent virtual_method " << endl; } };
2. 子类中重写虚函数 :
//子类 //继承父类 Parent //继承作用域 : 默认私有继承 private class Child : public Parent, public Parent1 { public: void parent_method() { //子类中调用父类的方法 , 该操作相当于 Java 中的 super 方法 Parent::parent_method(); Parent1::parent_method(); cout << " Child parent_method " << endl; } //重写父类的虚函数 void virtual_method() { cout << " Child virtual_method " << endl; } };
3. 调用虚函数 :
//在栈内存中创建一个 Child 对象, 并调用其重写的父类的方法 Child child; //多态 //声明 Parent1 父类对象 , 为其赋值一个 Child 对象 Parent* parent = new Child(); //静态多态 : 在编译时 , 就可以确定函数调用的地址 ; // 此时调用其 parent_method 方法 , 调用的是父类的方法 parent->parent_method(); //动态多态 : 在运行时 , 确定函数调用地址 , // 此处调用的是子类实现的方法 parent->virtual_method();
4. 代码执行结果 :
Parent parent_method Child virtual_method
5. 结果分析 :
① 静态多态分析 : 第一次调用父类的 parent_method 方法 , 虽然子重写该方法 , 但是对象类型声明的是父类类型 , 其仍然调用父类方法 ;
② 动态多态分析 : 第二次调用父类的 virtual_method 方法 , 该方法时虚函数 , 子类重写了该虚函数 , 在函数调用的时候 , 会自动根据对象的类型判定调用哪个方法 , 该对象使用 new Child() 创建 , 其类型是 Child 类型 , 因此最终调用的是子类重写的方法 ;
纯虚函数
1. 纯虚函数 : 类似于 Java 的抽象方法 , 父类中声明后 , 该方法必须实现 , 否则编译时报错 ;
2. 代码示例 :
① 父类中定义纯虚函数 :
//父类 class Parent{ public: //纯虚函数 , 类似于 Java 的抽象方法 , //父类中声明后 , 该方法必须实现 , 否则编译时报错 virtual void pure_virtual_method() = 0; };
② 子类中实现虚函数 :
//子类 //继承父类 Parent class Child : public Parent { public: //实现纯虚函数方法 , 该方法必须实现 , 否则会报错 void pure_virtual_method() { cout << " Child pure_virtual_method " << endl; } };
③ 调用子类中实现的纯虚函数 :
//在栈内存中创建一个 Child 对象, 并调用其重写的父类的方法 Child child; //纯虚函数测试 parent->pure_virtual_method();
④ 执行结果 :
Child pure_virtual_method
相关代码
1. 类的定义及继承相关代码 :
#pragma once using namespace std; //父类 class Parent{ public: void parent_method() { cout << " Parent parent_method " << endl; } //虚函数 virtual void virtual_method() { cout << " Parent virtual_method " << endl; } //纯虚函数 , 类似于 Java 的抽象方法 , //父类中声明后 , 该方法必须实现 , 否则编译时报错 virtual void pure_virtual_method() = 0; }; //父类 class Parent1 { public: void parent_method() { cout << " Parent1 parent_method " << endl; } void parent_method1() { cout << " Parent1 parent_method1 " << endl; } }; //子类 //继承父类 Parent //继承作用域 : 默认私有继承 private class Child : public Parent, public Parent1 { public: void parent_method() { //子类中调用父类的方法 , 该操作相当于 Java 中的 super 方法 Parent::parent_method(); Parent1::parent_method(); cout << " Child parent_method " << endl; } //重写父类的虚函数 void virtual_method() { cout << " Child virtual_method " << endl; } //实现纯虚函数方法 , 该方法必须实现 , 否则会报错 void pure_virtual_method() { cout << " Child pure_virtual_method " << endl; } };
2. 调用上述方法 :
执行结果 :
Parent parent_method Parent1 parent_method Child parent_method Parent1 parent_method1 Parent parent_method Child virtual_method Child pure_virtual_method