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。

 

------------恢复内容结束------------

posted on 2020-03-13 21:54  ~明月几时有  阅读(309)  评论(0)    收藏  举报