智能指针支持多态:std::shared_ptr<Base>和std::unique_ptr<Base>可指向派生类对象,通过虚函数实现动态绑定,调用派生类方法;基类需定义虚析构函数以确保正确析构。

在C++中,智能指针与多态结合使用是非常常见的场景,尤其是在管理具有继承关系的对象时。智能指针(如
std::shared_ptr
std::unique_ptr
要实现多态,基类中必须将需要重写的函数声明为 虚函数(virtual)。当通过基类指针或引用调用虚函数时,实际执行的是派生类中重写的版本。
智能指针本质上是“带资源管理的指针”,因此只要它们持有的是指向基类的指针,就可以像普通指针一样支持多态行为。
示例:
#include <memory>
#include <iostream>
class Base {
public:
virtual void say() {
std::cout << "Base says hello\n";
}
virtual ~Base() = default; // 虚析构函数很重要
};
class Derived : public Base {
public:
void say() override {
std::cout << "Derived says hello\n";
}
};
使用
std::shared_ptr<Base>
std::unique_ptr<Base>
Derived
立即学习“C++免费学习笔记(深入)”;
int main() {
std::shared_ptr<Base> ptr1 = std::make_shared<Derived>();
ptr1->say(); // 输出: Derived says hello
std::unique_ptr<Base> ptr2 = std::make_unique<Derived>();
ptr2->say(); // 输出: Derived says hello
return 0;
}
尽管
ptr1
ptr2
Base*
say()
Derived
如果基类没有虚析构函数,当通过基类指针删除派生类对象时,会导致未定义行为——派生类的析构函数不会被调用。
智能指针虽然自动管理内存,但依然依赖正确的析构机制。因此,任何打算被继承的类都应提供虚析构函数。
上面示例中:
virtual ~Base() = default;
确保了通过
shared_ptr<Base>
unique_ptr<Base>
Derived
Derived::~Derived()
Base::~Base()
std::vector<std::shared_ptr<Base>>
基本上就这些。智能指针本身不干扰虚函数机制,它们只是更安全地承载多态指针。只要正确使用虚函数和虚析构,智能指针能完美支持面向对象设计中的多态性。
以上就是C++智能指针多态 虚函数在智能指针表现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号