[C++]智能指针用于多态(利用返回类型可以是基类的特性

前言 

当函数返回一个派生类对象的指针(或智能指针)时,这个返回类型可以是基类的指针(或智能指针)。这种特性基于C++的多态性,允许基类指针指向派生类对象。这是面向对象编程中的一个核心概念,使得代码可以更加通用和灵活。

多态性和返回类型

多态性允许我们通过基类的指针(或引用)来操作不同的派生类对象,而不需要知道具体的派生类是什么。这意味着,函数可以返回基类类型的指针或智能指针,实际上指向的是派生类的实例。这种做法有几个重要的好处:

  • 封装:隐藏了具体实现的细节,只暴露了基类定义的接口。这样,实现细节的改变不会影响到使用这些对象的代码。
  • 可替换性:可以在不改变外部代码的情况下,更换对象的具体实现。只要新的实现类也是基类的派生类,就可以用新的派生类实例来替换原有实例。
  • 扩展性:可以很容易地添加新的派生类来扩展程序的功能,而不需要修改依赖于基类接口的代码。

代码示例

假设你有一个基类Animal和两个派生类DogCat。你可以有一个返回Animal指针的函数,实际上返回的是指向DogCat对象的指针:

 
class Animal //基类
{
public:
    virtual void speak() = 0;//纯虚函数
};

class Dog : public Animal 
{
public:
    void speak() override 
    {
        std::cout << "Woof!" << std::endl;
    }
};

class Cat : public Animal 
{
public:
    void speak() override 
    {
        std::cout << "Meow!" << std::endl;
    }
};

std::unique_ptr<Animal> getAnimal(const std::string& type) 
{
    if (type == "dog") 
    {
        //std::shared_ptr可以用new来实例化,
        //但std::unique_ptr用new存在安全隐患
        //所以c++14后新增std::make_shared和make_unique,
        //按下面语法实例化,不用new
        auto test_1 = std::make_unique<Dog>();
        return test_1;
    } else if (type == "cat") 
    {
        auto test_2 = std::make_unique<Dog>();
        return test_2;
    }
    return nullptr;
}

在这个例子中,getAnimal函数根据传入的字符串返回指向不同派生类对象的std::unique_ptr<Animal>。尽管返回类型是基类Animal的智能指针,实际返回的对象可以是任何Animal的派生类。这允许调用者使用基类接口来操作这些对象,而不用关心具体的派生类类型。当然,std::shared_ptr也支持这种特性。

注意事项

 

  • 当通过基类指针(或智能指针)调用派生类的函数时,确保基类的函数被声明为virtual,这样才能正确地调用到派生类的重写或实现版本。
  • 在使用std::unique_ptr转移所有权时要特别小心,因为它不支持拷贝操作,只能通过移动语义std::move来转移所有权。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值