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)