C++三大特性,封装、继承、多态(三)什么是多态,多态需要满足什么条件,怎么使用,它的实现原理是什么?

概念:

  多态是指一个接口,根据传入的参数不同,呈现多种多态,多态分为静态多态和动态多态。

  静态多态:像函数重载和运算符重载属于静态多态,复用函数名。它的函数地址在编译阶段就已经确定了。

  动态多态:通过派生类和虚函数实现运行时多态(有子类继承,子类重写父类虚函数),它的函数地址在运行时确定。

  多态需要满足的条件:1、子类继承父类  2、子类重写父类中的虚函数。

  怎么使用多态:父类指针或引用指向子类对象   (Animal & animal = cat 或者 Animal *animal = new cat)

  示例:

     

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Animal
 5 {
 6 public:
 7     virtual void speak()   //不加virtual,空类 sizeof(Animal)为1,加virtual后sizeof(Animal)则为8了,因为此时类里有虚函数表指针了
 8     {
 9         cout << "动物在说话" << endl;
10     }
11 };
12 
13 class Cat :public Animal
14 {
15 public:
16     //子类必须实现,不实现的话,还是继承父类的&Animal::speak,实现之后就&Cat::speak 覆盖了父类的&Animal::speak
17     void speak()
18     {
19         cout << "小猫在说话" << endl;
20     }
21 };
22 
23 void DoSpeak(Animal& animal)  
24 {
25     animal.speak();
26 }
27 
28 class Dog :public Animal
29 {
30 public:
31     void speak()
32     {
33         cout << "小狗在说话" << endl;
34     }
35 
36 };
37 void test01()
38 {
39     Cat cat;
40     DoSpeak(cat);//多态的使用,Animal & animal =cat,或者Animal *animal=new Cat;
41 
42     Dog dog;
43     DoSpeak(dog);
44 }
45 int main()
46 {
47     test01();
48 
49     system("pause");
50 
51     return 0;
52 }
实现原理:
   在vs中k开发者命令工具中,可以通过命令:cl /d1 reportSingleClassLayout类名 “xxx.cpp”
   可以查看单类布局报告,如下图:

 注意:多态的这个指针叫做虚函数指针(vftable,virtual function pointer),菱形继承里的那个指针叫做虚基类指针(vbptr,virtual base pointer)

 

 

 

posted @ 2023-04-25 19:21  潘阳399  阅读(70)  评论(0编辑  收藏  举报