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的方式设计项目,可以把这个模块构建出来,并且测试代码也可以提前完成。

相关文章
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
38 2
C++入门12——详解多态1
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
80 1
|
3月前
|
编译器 C++ 索引
C++虚拟成员-虚函数
C++虚拟成员-虚函数
|
3月前
|
存储 编译器 C++
|
4月前
|
存储 编译器 C++
【C++】深度解剖多态(下)
【C++】深度解剖多态(下)
54 1
【C++】深度解剖多态(下)
|
3月前
|
存储 编译器 C++
C++多态实现的原理:深入探索与实战应用
【8月更文挑战第21天】在C++的浩瀚宇宙中,多态性(Polymorphism)无疑是一颗璀璨的星辰,它赋予了程序高度的灵活性和可扩展性。多态允许我们通过基类指针或引用来调用派生类的成员函数,而具体调用哪个函数则取决于指针或引用所指向的对象的实际类型。本文将深入探讨C++多态实现的原理,并结合工作学习中的实际案例,分享其技术干货。
75 0
|
4月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
|
4月前
|
Java 编译器 C++
【C++】深度解剖多态(上)
【C++】深度解剖多态(上)
55 2
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
C++多态崩溃问题之在PyTorch中,如何定义一个简单的线性回归模型
C++多态崩溃问题之在PyTorch中,如何定义一个简单的线性回归模型
|
4月前
|
编译器 程序员 C++
【C++高阶】掌握C++多态:探索代码的动态之美
【C++高阶】掌握C++多态:探索代码的动态之美
44 0