c++学习-多态
1.概述
多态作用:相同接口(函数名)表现出不同行为。解耦合,调用者不关心接口实现细节,只关注抽象基类提供什么接口。不同电视的开机逻辑不一样,但是只要都提供了开机控制按键(指定函数接口),外部使用者都可以点击开机键打开不同电视(调用统计函数接口实现不同功能)
基本概念
2.使用流程
通过虚函数实现多态:
类中有虚函数时,编译器会自动生成一个虚函数表指针,调用虚函数时会动态选择实际执行到函数
#include <iostream>using namespace std;class Animal
{
public:virtual void speak(){cout << "Animal speaks" << endl;}
};class Cat : public Animal
{
public:void speak() {cout << "Cat speaks" << endl;}
};class Dog : public Animal
{
public:void speak() {cout << "Dog speaks" << endl;}
};void testSpeak(Animal& animal) {animal.speak();
}void test() {Cat cat;testSpeak(cat); // Animal speaksDog dog;testSpeak(dog); // Animal speaks
}void testSize() {std::cout << "Size of Animal: " << sizeof(Animal) << std::endl;
}int main() {test();testSize();return 0;
}
3.问题
1.为什么父类指针指向子类可以找到并调用子类函数,内存模型原理是什么
子类重写父类虚函数,子类中虚函数表记录函数信息会换成子类的
2.为什么值传递不会触发多态
值传递复制子类对象时会发生切片,只会复制子类对象中的父类成员变量,因此不会复制子类中的虚函数表指针。
3.静态成员函数可以是虚函数吗
不可以,虚函数映射表指针本质也是普通类成员变量,使用时需要通过this指针
4.总结
1.声明虚函数以后类中会自动生成一个指针类成员变量,指向虚函数表。
2.
3.
思维导图链接:https://www.yuque.com/fengdeshengyin-dssub/gefhac/iolihgpsdgvez4ob?singleDoc# 《c++类和对象》