C++虚函数与多态(二)

简介: C++虚函数与多态(二)

多态

多态:在继承中,指针的同一行为的不同结果

多态的概念其实并不重要,重要的是,你需要知道,那个对象指针在特定情况调用那个成员。

实现多态的2个条件

1.必须是public继承

2.必须父类存在virtual类型的成员函数,并且子类中存在该函数的同名函数。

3.一定存在对象的引用

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  void print()
  {
    cout << "MM" << endl;
  }
  virtual void printDate()
  {
    cout << "virtual printDate" << endl;
  }
  virtual ~MM()
  {
    cout << "MM析构" << endl;
  }
protected:
  string M_name;
};
class son : public MM
{
public:
  void print()
  {
    cout << "son" << endl;
  }
  void printDate()
  {
    cout << "printDate" << endl;
  }
  ~son()
  {
    cout << "son析构" << endl;
  }
};
int main()
{
  //MM* p = new son; //父类指针,构造子类对象,先构造父类对象,在构造子类的对象
  //delete p;
  MM* p = new son;
      p->print();  // 没有virtual,看指针类型,这里调用的是父类的
    p->printDate();  //有virtual,看对象,这里调用的是son的
    p = new MM;  //调用MM 的   这就是多态
    p->print(); 
    //引用的类型也存在多态
    MM mm;
    MM& girl = mm;
    mm.printDate();
  system("pause");
  return 0;
}

虚函数的几个问题

不管被继承几次,父类中有的虚函数,依然存在

#include<iostream>
using namespace std;
class A
{
public:
  virtual void print()
  {
    cout << "A" << endl;
  }
};
class B : public A
{
public:
};
class C : public B
{
public:
  void print()
  {
    cout << "C" << endl;
  }
};
int main()
{
  A* p = new C;
  p->print();
  system("pause");
  return 0;
}

子类实现父类虚函数的同名函数叫做:重写

final :静止重写(子类中不允许存在与之同名的虚函数)

override :强制重写,起说明作用,表示子类当前是方法是重写父类(就是说明父类中一定存在一个同名的虚函数),用于子类实现父类的同名虚函数

#include<iostream>
using namespace std;
class A
{
public:
  virtual void print() final   //final:静止重写,子类中不能够存在同名函数
  {
  }
  virtual void printDate()
  {
  }
};
class B : public A
{
public:
  void printDate() override // 强制重写,起说明作用,表示子类当前是方法是重写父类(就是说明父类中一定存在一个同名的虚函数)
  {
  }
};
int main()
{
  system("pause");
  return 0;
}

纯虚函数和ADT

ADT:抽象数据类型

注意:抽象类本身不能够创建对象,但是抽象类的子类可以创建对象

抽象类,一般用于架构项目,构建好整个项目模块,具体的细致工作,交给子类去实现

采用ADT的方式设计项目,可以把这个模块构建出来,并且测试代码也可以提前完成。

目录
打赏
0
0
0
0
1
分享
相关文章
c++--多态
上一篇文章已经介绍了c++的继承,那么这篇文章将会介绍多态。看完多态的概念,你一定会感觉脑子雾蒙蒙的,那么我们先以举一个例子,来给这朦胧大致勾勒出一个画面,在此之前,先介绍一个名词虚函数,(要注意与虚拟继承区分)重定义: 重定义(隐藏)只要求函数名相同(但要符合重载的要求,其实两者实际上就是重载);重定义下:在这种情况下,如果通过父类指针或引用调用函数,会调用父类的函数而不是子类。重定义(或称为隐藏)发生的原因是因为函数名相同但参数列表不同,导致编译器无法确定调用哪一个版本的函数。
42 0
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
494 0
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
111 4
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
127 3
【C++】多态
多态是面向对象编程中的重要特性,允许通过基类引用调用派生类的具体方法,实现代码的灵活性和扩展性。其核心机制包括虚函数、动态绑定及继承。通过声明虚函数并让派生类重写这些函数,可以在运行时决定具体调用哪个版本的方法。此外,多态还涉及虚函数表(vtable)的使用,其中存储了虚函数的指针,确保调用正确的实现。为了防止资源泄露,基类的析构函数应声明为虚函数。多态的底层实现涉及对象内部的虚函数表指针,指向特定于类的虚函数表,支持动态方法解析。
85 1
|
9月前
|
C++入门12——详解多态1
C++入门12——详解多态1
108 2
C++入门12——详解多态1
|
9月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
144 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问