网站的访问量怎么查,英文网站优化,电商app制作平台,怎么制作图片链接一、基本概念
同一操作作用于不同的对象#xff0c;产生不同的执行结果 #x1f449; 就像「按F1键」#xff1a;在Word弹出帮助文档#xff0c;在PS弹出画笔设置#xff0c;同一个按键触发不同功能 #xff08;1#xff09;多态类型
类型实现方式绑定时机静态多态…一、基本概念
同一操作作用于不同的对象产生不同的执行结果 就像「按F1键」在Word弹出帮助文档在PS弹出画笔设置同一个按键触发不同功能 1多态类型
类型实现方式绑定时机静态多态函数重载、运算符重载编译时绑定动态多态虚函数继承体系运行时绑定 2动态多态三要素
多态满足条件 有继承关系子类重写父类中的虚函数 多态使用条件 父类指针或引用指向子类对象 重写函数返回值类型 函数名 参数列表 完全一致称为重写 (缺一不可) class 父类名 {
public:virtual 返回类型 函数名(参数列表) {// 函数体}
}; 3示例代码
// 父类
class Animal {
public:virtual void speak() { // 1. 虚函数声明cout 动物发声 endl;}
};// 子类
class Cat : public Animal { // 1. 继承关系
public:void speak() override { // 2. 重写虚函数cout 喵喵 endl; }
};// 多态调用
void doSpeak(Animal animal) { // 3. 父类引用接收子类对象animal.speak(); // 运行时决定调用哪个实现
}void doSpeak(Animal *animal) {// 4.用指针接收子类对象animal-speak();
}void test() {Cat cat;doSpeak(cat); // 输出喵喵
} 4重要特性
函数重写严格一致(此处是函数内参数不一致)
// 错误示例参数不同
class Animal { virtual void func(int) };
class Cat : public Animal { void func() }; // 不会触发多态 二、多态原理 当子类重写父类的虚函数子类中的虚函数表内部会替换成 子类的虚函数地址 例
class Animal
{
public://虚函数virtual void speak(){cout 动物在说话 endl;}
};
//猫类
class Cat : public Animal
{
public://重写 函数返回值类型 函数名 参数列表 完全相同virtual void speak(){cout 小猫在说话 endl;}
};
原理概况 当父类的指针或者引用指向子类对象时候发生多态 Animal animal cat;
animal.speak();
vfptr - 虚函数表指针v - virtual
f - function
ptr - pointervtable - 虚函数表v - virtual
f - function
table - table 三、纯虚函数和抽象类 在多态中通常父类中虚函数的实现是毫无意义的主要都是调用子类重写的内容 因此可以将虚函数改为纯虚函数当类中有了纯虚函数这个类也称为抽象类 纯虚函数语法virtual 返回值类型 函数名参数列表 0 ; virtual void func() 0; 抽象类特点 1、无法实例化对象 若Base是抽象类则下面两行报错
Base b;
new Base; 2、子类必须重写抽象类中的纯虚函数否则也属于抽象类 写纯虚函数意义就是想让子类重写一遍纯虚函数 四、虚析构与纯虚析构
1.核心问题
内存泄漏场景
class Animal {
public:~Animal() { // ❌ 普通析构cout Animal析构 endl;}
};class Cat : public Animal {
public:~Cat() {cout Cat析构 endl;delete[] m_data; // 堆内存资源}
private:int* m_data new int[100];
};void test() {Animal* pet new Cat();pet-speak();delete pet; // 仅调用Animal析构 → 内存泄漏
}
执行结果
Animal析构
Cat析构未被调用 → m_data内存泄漏 2.解决方案对比
方案类型语法示例类性质实现要求使用场景虚析构virtual ~Animal() {}普通类必须实现需要实例化基类对象纯虚析构virtual ~Animal() 0;抽象类必须单独实现强制子类实现特定行为 3.具体实现
1. 虚析构函数
class Animal {
public:virtual ~Animal() { // ✅ 虚析构声明cout Animal虚析构 endl;}
};// 正确执行结果
// Cat析构
// Animal虚析构
2. 纯虚析构函数
class Animal {
public:virtual ~Animal() 0; // 纯虚析构声明
};// 必须单独实现
Animal::~Animal() { // ✅ 纯虚析构实现cout Animal纯虚析构 endl;
}
特性
使类成为抽象类无法实例化子类必须实现析构函数
class Cat : public Animal {
public:~Cat() override { // 必须实现cout Cat析构 endl;}
};