1. 普通虚函数(Virtual Function)
- 定义:基类中用
virtual声明,允许派生类 覆盖(Override)。 - 特点:
- 基类可提供默认实现。
- 派生类可选择性覆盖(若不覆盖,则调用基类版本)。
- 示例:
class Shape { public: virtual void draw() { cout << "Drawing a shape." << endl; } };
2. 纯虚函数(Pure Virtual Function)
-
定义:基类中用
virtual声明并以= 0结尾,强制派生类必须实现。 -
特点:
- 基类成为 抽象类(Abstract Class),无法实例化。
- 用于定义接口规范,强制派生类遵守。
-
示例:
class Shape { public: virtual void draw() = 0; // 纯虚函数 };
3. 虚析构函数(Virtual Destructor)
- 定义:基类的析构函数声明为
virtual,确保派生类对象通过基类指针删除时,能正确调用派生类的析构函数。 - 场景:基类指针指向派生类对象时,必须使用虚析构函数以避免资源泄漏。
- 现象:先执行派生类析构函数,再执行基类析构函数
3.1 虚构函数
#include <iostream>
// 基类
class Base {
public:
// 虚析构函数
virtual ~Base() {
std::cout << "Base class destructor" << std::endl;
}
};
// 派生类
class Derived : public Base {
public:
~Derived() override {
std::cout << "Derived class destructor" << std::endl;
}
};
int main() {
// 通过基类指针创建派生类对象
Base* basePtr = new Derived();
// 删除基类指针
delete basePtr;
return 0;
}
3.2 纯虚构函数
#include <iostream>
// 基类
class Base {
public:
// 虚析构函数
// virtual ~Base() {
// std::cout << "Base class destructor" << std::endl;
// }
virtual ~Base() = 0;
};
Base::~Base() // 必须提供实现
{
std::cout << "Base class destructor = 0" << std::endl;
}
// 派生类
class Derived : public Base {
public:
~Derived() override {
std::cout << "Derived class destructor" << std::endl;
}
};
int main() {
// 通过基类指针创建派生类对象
Base* basePtr = new Derived();
// 删除基类指针
delete basePtr;
return 0;
}
4. 关键词 (C++11)
一、override
显式标记派生类中对基类虚函数的重写,强制编译器检查函数签名是否完全匹配,避免因拼写错误或参数不匹配导致意外定义新函数
二、final
修饰类:禁止类被继承(如工具类或不可变类)。
修饰虚函数:禁止派生类进一步重写该函数(如关键算法或接口)。
class Base {
public:
virtual void log() final { // 禁止派生类覆盖
cout << "Base log." << endl;
}
};
#include <iostream>
// 基类
class Base {
public:
// 虚函数
virtual void print() {
std::cout << "This is the Base class." << std::endl;
}
};
// 派生类
class Derived : public Base {
public:
// 重写基类的虚函数
void print()final {
std::cout << "This is the Derived class." << std::endl;
}
};
// 派生类的派生类
/*
class Deriveder : public Derived {
public:
// 重写基类的虚函数
void print() override {
std::cout << "This is the Deriveder class." << std::endl;
}
};
*/
// 多态函数
void callPrint(Base* obj) {
obj->print();
}
int main() {
Base base;
Derived derived;
//Deriveder Deriveder;
// 调用多态函数
callPrint(&base);
callPrint(&derived);
//callPrint(&Deriveder);
return 0;
}

1983

被折叠的 条评论
为什么被折叠?



