【C++】非常重要的——多态(一)

简介: 【C++】非常重要的——多态

1.多态的概念

多态,就是不同对象去完成某一种行为时,产生的不同状态。


举例说明:日常生活中,我们去买票,尤其买火车票时,总会有不同的结果。当成人买的时候,就是原价,学生就是半价,军人就是优先买票,这都体现了多态。不同对象完成某一行为,产生不同状态。


那实现多态前,我们首先得清楚一些概念:


1.1虚函数

虚函数:即被virtual修饰的类成员函数称为虚函数。

class A
{
public:
  virtual void func()
  {
    cout << "A" << endl;
  }
};

1.2虚函数的重写

我们之前在继承的时候,学习过重定义(隐藏),现在在多态这一节,又出现了重写,那到底是什么呢?我们来看一看


重定义(隐藏):首先在两个不同的类中(父类,子类)(构成继承),只要函数名相同,就会构成重定义(隐藏)。


重写(覆盖):在重定义的基础上,除了函数名要相同,还有返回值,参数都得相同,这才构成重写。


举个例子:

class A
{
public:
  virtual void func()
  {
    cout << "A" << endl;
  }
};
class B:public A
{
public:
  virtual void func()  //重写
  {
    cout << "B" << endl;
  }
};

总结就是:虚函数的重写条件:子类和父类都是虚函数,且函数名,返回值,参数都必须相同(三同),这才能构成虚函数的重写。


1.3虚函数重写的两个例外

1.子类的虚函数可以不加virtual

因为是继承关系,父类的虚函数也被继承下来,所以子类的可以不加virtual。(建议还是都写上)

class A
{
public:
  virtual void func()
  {
    cout << "A" << endl;
  }
};
class B:public A
{
public:
  void func()
  {
    cout << "B" << endl;
  }
};

2. 协变(基类与派生类虚函数返回值类型不同)

意思是:三同中,返回值可以不同,但要求返回值必须是父子类关系的指针或引用。(其他父子类关系的指针或者引用也可以)

class person
{
public:
  virtual person* func()  //本父子类指针或引用
  {
    return this;
  }
};
class student:public person
{
public:
  virtual student* func() //本父子类指针或引用
  {
    return this;
  }
};

、其他父子类关系的指针或者引用也可以:

class A
{};
class B:public A
{};
class person
{
public:
  virtual A* func()
  {
    return nullptr;
  }
};
class student:public person
{
public:
  virtual A* func()
  {
    return nullptr;
  }
};

但是父类的返回值不可以为子类的指针。

1.4如何实现一个不能被继承的类

方法一:是需要把它的构造函数写为私有即可,无法构造,就不可能被继承;

方法二:类定义时,加final(c++11),最终类,不能被继承

class A final
{};
class B:public A
{};

若final给虚函数,虚函数则不能被重写

class A
{
  virtual void func()final
  {}
};
class B:public A
{
  virtual void func()
  {}
};

override是来判断是否已经重写(检查重写)

class A
{
  virtual void func(int)
  {}
};
class B:public A
{
  virtual void func()override
  {}
};


目录
相关文章
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
38 2
C++入门12——详解多态1
|
6月前
|
C++
C++中的封装、继承与多态:深入理解与应用
C++中的封装、继承与多态:深入理解与应用
150 1
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
3月前
|
存储 编译器 C++
|
4月前
|
存储 编译器 C++
【C++】深度解剖多态(下)
【C++】深度解剖多态(下)
53 1
【C++】深度解剖多态(下)
|
4月前
|
存储 编译器 C++
|
3月前
|
存储 编译器 C++
C++多态实现的原理:深入探索与实战应用
【8月更文挑战第21天】在C++的浩瀚宇宙中,多态性(Polymorphism)无疑是一颗璀璨的星辰,它赋予了程序高度的灵活性和可扩展性。多态允许我们通过基类指针或引用来调用派生类的成员函数,而具体调用哪个函数则取决于指针或引用所指向的对象的实际类型。本文将深入探讨C++多态实现的原理,并结合工作学习中的实际案例,分享其技术干货。
74 0
|
4月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
|
4月前
|
Java 编译器 C++
【C++】深度解剖多态(上)
【C++】深度解剖多态(上)
54 2
|
4月前
|
程序员 C++
【C++】揭开C++多态的神秘面纱
【C++】揭开C++多态的神秘面纱