多态发生的条件:
- 有继承关系
- 子类重写父类中的虚函数(重写是作用在不同作用域,重载是作用在相同作用域内)
- 通过父类指针或引用指向子类对象
用VS开发人员工具查看发生多态时的对象内存模型:
其中Cat类继承于Animal类且重写了Speak函数,Dog类仅继承于Animal类,没有发生重写
#include <iostream>
class Animal
{
public:
virtual void Speak()
{
std::cout << "动物在说话" << std::endl;
}
};
class Cat :public Animal
{
public:
virtual void Speak()
{
std::cout << "猫在说话" << std::endl;
}
};
class Dog :public Animal
{
};
int main()
{
std::cout << "Animal的大小:" << sizeof(Animal) << std::endl; //x86 4byte
std::cout << "Cat的大小:" << sizeof(Cat) << std::endl; //x86 4byte
std::cout << "Dog的大小:" << sizeof(Dog) << std::endl; //x86 4byte
system("pause");
return 0;
}
内存模型:
总结:
- 当子类重写父类虚函数时,子类的虚函数表中的重写虚函数会替换成子类的方法,即覆盖了原本是父类的实现方法,但不影响父类的虚函数表内容
- 当子类没有发生重写时,子类的虚函数表内容与父类的虚函数表内容一样