C++之多态

简介: C++之多态



一,概念等基础

1)多态的定义

通俗来说就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

举个例子:不同的人去买高铁票,同样的行为,因为身份的不同,有的人买的是学生票,有些人是儿童票,有些人是普通票,也就是多种形态去做同一个事会产生不同的状态。

2)虚函数

虚函数是多态的重要组成部分。

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

class Person {
public:
 virtual void BuyTicket() { cout << "买票-全价" << endl;}
};
3)构成多态的条件

1. 必须通过基类的指针或者引用调用虚函数

2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

4)虚函数的作用

虚函数在被继承类里面被重写之后,调用这个函数就会满足多态,接下来看代码。

class A {
public:
  virtual void func() {
    cout << "a";
  }
};
class B :public A{
public:
  virtual void func() {
    cout << "b";
  }
};
void test(A& a){
a.func();
}
int main(){
B b;
test(b);
return 0;
}

运行结果:b

这就是因为在a掉用func函数时满足了多态的调用,会通过a指向空间里面的func函数来调用,而不是A里面的func函数。这样子就能让不同的对象去做相同的动作而产生不同的状态。

小细节:使用析构函数的多态,这样可以做到通过底层空间来调用析构函数,防止内存泄漏。

二,多态原理

1)虚指针

在VS2019里面创建一个类,里面有虚函数

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

打开监视窗口,监视a

a里面有_vf这是什么?它在a的前四个字节,首先我们能发现这是一个二级指针,指针里面是一个函数指针,我们把_vf称为虚指针,虚指针指向一个包括函数的表,这个表称为虚函数表,进一步探索我们能知道这个指针是a里面所有的虚函数地址,通过这个地址我们能调用虚函数。

2)如何拿到这个虚指针

在C++中我们想要拿到这个地址,我们首先要知道每个类的地址是连续的,所以想要拿到虚指针,可以通过地址的偏移来拿到虚指针,通过虚指针找到虚函数的地址实现调用虚函数。

3)到底如何实现多态

首先在继承的时候会把这个虚指针指向的虚函数表继承下来,继承之后,如果虚函数被重写了,那么虚函数表的地址就会被新的虚函数地址覆盖,如果没有重写就不会改变。如果本身也有虚函数的话,那么自身的虚函数就会在继承的所有类的第一个类的虚函数表后面按顺序加上,然后才会加上其他继承类的虚函数表(多继承)。在调用的时候会根据底层的地址减去偏移量拿到虚指针,通过虚指针里面的地址来调用函数,因为虚函数表被重写的函数已经被覆盖率,那么就可以达到根据底层来调用虚函数。

注:如果大家对文章有疑惑或者发现了文章的错误,本人是在校大学生,会经常查看评论区的,大家不妨耐住耐心等我回答。

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