【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(二)

简介: 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(二)

虚函数


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. 调用上述方法 :


//在栈内存中创建一个 Child 对象, 并调用其重写的父类的方法
  Child child;
  //调用子类重写的父类的方法
  child.parent_method();
  //调用子类没有重写的父类方法
  child.parent_method1();
  //多态
  //声明 Parent1 父类对象 , 为其赋值一个 Child 对象
  Parent* parent = new Child();
  //静态多态 : 在编译时 , 就可以确定函数调用的地址 ; 
  //  此时调用其 parent_method 方法 , 调用的是父类的方法
  parent->parent_method();
  //动态多态 : 在运行时 , 确定函数调用地址 , 
  //  此处调用的是子类实现的方法
  parent->virtual_method();
  //纯虚函数测试
  parent->pure_virtual_method();


执行结果 :


Parent parent_method
 Parent1 parent_method
 Child parent_method
 Parent1 parent_method1
 Parent parent_method
 Child virtual_method
 Child pure_virtual_method


目录
相关文章
|
2月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
590 2
|
2月前
|
安全 Java 编译器
C++进阶(1)——继承
本文系统讲解C++继承机制,涵盖继承定义、访问限定符、派生类默认成员函数、菱形虚拟继承原理及组合与继承对比,深入剖析其在代码复用与面向对象设计中的应用。
|
3月前
|
存储 缓存 监控
用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
142 4
|
6月前
|
存储 安全 Java
c++--继承
c++作为面向对象的语言三大特点其中之一就是继承,那么继承到底有何奥妙呢?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用,继承就是类方法的复用。
149 0
|
9月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
482 6
|
9月前
|
存储 编译器 C++
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
1150 0
|
11月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
167 16
|
11月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
331 5
|
11月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
263 4
|
11月前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
219 3