C++虚函数、动态联编与动态多态
虚函数的工作原理:
一、为每一个包含虚函数的类建立一个虚函数表,表中的每一项存放的是虚函数在内存中的入口地址
二、在该类的每个对象中设置一个指向虚函数表的指针,在调用虚函数时,通过虚指针找到虚函数表,找出虚函数的入口地址在表中的位置,获取入口地址完成调用
三、虚函数表是一个类的所有对象共享,所有对象的虚指针都指向同一个虚函数表
四、对任意包含虚函数的类,将虚函数的入口地址写入虚函数表,一个类的虚函数有两个来源,继承自父类的虚函数,如果在当前类中被改写,则虚函数的入口地址是改写之后的函数地址,否则保留父类中虚函数的入口地址,新声明的虚函数,其入口地址是当前类中该函数的入口地址
动态联编的概念:在程序执行阶段才将函数实现和调用相关联,被调函数的入口地址是在运行时、而不是在编译时确定的
多态的实现方法:子类中重写父类的虚函数,父类的指针或引用指向子类对象
#include<iostream> using namespace std; class Animal { public: virtual void speak() { cout << "动物在说话" << endl; } }; class Cat :public Animal { public: void speak() { cout << "小猫在说话" << endl; } }; class Dog :public Animal { public: void speak() { cout << "小狗在说话" << endl; } }; void doSpeak(Animal &animal) { animal.speak(); } void test01() { Cat cat; doSpeak(cat); Dog dog; doSpeak(dog); } int main() { test01(); system("pause"); return 0; } //如果输出sizeof(Animal)结果为4字节,Animal类中存在一个虚函数 //表指针vfptr,vfptr指向一个虚函数表,表中记录虚函数的入口地址 //&Animal::speak,当子类重写父类的虚函数时,子类虚函数表中的内容 //改变为&Cat::speak。
------------恢复内容结束------------
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号