C++ --多态

简介: C++ --多态

一、多态

多态出现的条件

  • 继承关系
  • 子类中重写父类的虚函数
  • 父类指针或者引用指向子类对象

1.1 多态的实现原理

1、父类成员函数中包含虚函数,虚函数会在会在父类中留下一个虚函数指针,指向父类虚函数。

2、发生继承时,子类也同样会继承下这个指针,当子类中重写这个虚函数时:子类的函数地址会覆盖掉继承下来的虚函数地址。

3、函数调用时就会根据对象类的不同来调用对应的函数。

1.2 代码示例

//多态
//运行阶段确定函数地址
//多态发生的条件:继承关系 && 子类中重写父类的虚函数 && 父类指针或者引用指向子类对象
class Animal
{
public:
  //父类中声明虚函数
  virtual void stream()
  {
    cout << "The animal is streaming
";
  }
};
class Cat : public Animal
{
public:
  //子类中重写了父类中的stream()函数,不能事先确定调用哪个函数。
  void stream()
  {
    cout << "The cat is streaming
";
  }
};
void doStream(Animal& animal)
{
  animal.stream();
}
int main()
{
  Animal a;
  Cat cat;
  doStream(a);
  doStream(cat);
  return 0;
}

f16f447398114179bf6d1779ca0cc263.png

相关文章
|
5月前
|
存储 人工智能 编译器
c++--多态
上一篇文章已经介绍了c++的继承,那么这篇文章将会介绍多态。看完多态的概念,你一定会感觉脑子雾蒙蒙的,那么我们先以举一个例子,来给这朦胧大致勾勒出一个画面,在此之前,先介绍一个名词虚函数,(要注意与虚拟继承区分)重定义: 重定义(隐藏)只要求函数名相同(但要符合重载的要求,其实两者实际上就是重载);重定义下:在这种情况下,如果通过父类指针或引用调用函数,会调用父类的函数而不是子类。重定义(或称为隐藏)发生的原因是因为函数名相同但参数列表不同,导致编译器无法确定调用哪一个版本的函数。
99 0
|
9月前
|
编译器 C++
c++中的多态
c++中的多态
|
8月前
|
存储 编译器 C++
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
1042 0
|
12月前
|
存储 编译器 数据安全/隐私保护
【C++】多态
多态是面向对象编程中的重要特性,允许通过基类引用调用派生类的具体方法,实现代码的灵活性和扩展性。其核心机制包括虚函数、动态绑定及继承。通过声明虚函数并让派生类重写这些函数,可以在运行时决定具体调用哪个版本的方法。此外,多态还涉及虚函数表(vtable)的使用,其中存储了虚函数的指针,确保调用正确的实现。为了防止资源泄露,基类的析构函数应声明为虚函数。多态的底层实现涉及对象内部的虚函数表指针,指向特定于类的虚函数表,支持动态方法解析。
137 1
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
143 2
C++入门12——详解多态1
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
197 1
|
存储 编译器 C++
【C++】深度解剖多态(下)
【C++】深度解剖多态(下)
142 1
【C++】深度解剖多态(下)
|
存储 编译器 C++
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)