C++ 多态详解
多态(Polymorphism)是面向对象编程的三大核心特性之一,源于希腊语'多种形态'。在 C++ 中,它允许我们使用统一的接口处理不同类型的对象,显著提高了代码的灵活性和可扩展性。
什么是多态?
简单来说,就是同一接口,多种形态。不同的对象可以通过相同的方法名调用,但实际执行的逻辑由对象自身的类决定。这实现了调用者与实现的解耦,你只需关注接口,无需关心具体实现细节。
多态的实现条件
要实现多态,必须同时满足以下三个条件:
- 继承关系:必须是基类的指针或者引用调用虚函数。只有基类指针或引用才能既指向基类对象又指向派生类对象。
- 虚函数:被调用的函数必须是虚函数。
- 重写/覆盖:派生类必须对基类的虚函数完成重写。如果没重写,基类和派生类之间就没有不同的函数行为,多态效果也就无从谈起。
💡 注意:非成员函数不能加
virtual修饰。
class A {
public:
virtual void func() {}
};
虚函数的重写与覆盖
当派生类中有跟基类完全相同的虚函数(返回值类型、函数名字、参数列表完全相同),称派生类的虚函数重写了基类的虚函数。
协变(Covariance)
派生类重写基类虚函数时,返回类型可以不同,但需满足特定规则:
- 基类虚函数返回基类对象的指针或引用。
- 派生类虚函数返回派生类对象的指针或引用。
- 其他部分(参数、常量性)必须完全相同。
编译器会自动处理类型转换,确保调用的一致性。
析构函数的重写
这是一个极易踩坑的地方。基类的析构函数必须声明为 virtual。
如果基类析构函数没有加 virtual,通过基类指针删除派生类对象时,只会调用基类析构函数,导致派生类特有的资源(如内存泄漏)无法释放。
class Base {
public:
virtual ~Base() { cout << "~Base" << endl; }
};
class Derived : public Base {
public:
~Derived() { cout << "~Derived" << endl; }
};
int main() {
Base* p = Derived;
p;
;
}


