首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用模板将std::shared_ptr<Derived>向上转换为std::shared_ptr<Base>

在C++中,可以使用std::static_pointer_cast函数将std::shared_ptr<Derived>向上转换为std::shared_ptr<Base>

代码语言:javascript
复制
#include <iostream>
#include <memory>

class Base {
public:
    virtual ~Base() = default;
};

class Derived : public Base {
public:
    void print() {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    std::shared_ptr<Derived> derived_ptr = std::make_shared<Derived>();

    // 将 std::shared_ptr<Derived> 向上转换为 std::shared_ptr<Base>
    std::shared_ptr<Base> base_ptr = std::static_pointer_cast<Base>(derived_ptr);

    // 使用 dynamic_cast 检查转换是否成功
    std::shared_ptr<Derived> derived_ptr_check = std::dynamic_pointer_cast<Derived>(base_ptr);
    if (derived_ptr_check) {
        std::cout << "Conversion successful" << std::endl;
        derived_ptr_check->print();
    } else {
        std::cout << "Conversion failed" << std::endl;
    }

    return 0;
}

在这个例子中,我们创建了一个std::shared_ptr<Derived>对象,然后使用std::static_pointer_cast将其向上转换为std::shared_ptr<Base>。为了确保转换成功,我们使用std::dynamic_pointer_cast尝试将std::shared_ptr<Base>转换回std::shared_ptr<Derived>。如果转换成功,我们将打印出"Conversion successful"以及"Derived class"。

请注意,向上转换(从派生类到基类)是安全的,因为派生类对象包含基类对象的所有信息。然而,向下转换(从基类到派生类)可能会导致未定义行为,因此需要谨慎处理。在这种情况下,可以使用std::dynamic_pointer_cast进行安全的向下转换,它会在转换失败时返回空指针。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一文讲全C++中类型转换操作符

用于向上转型(Upcasting)和向下转型(Downcasting)之间的转换,但不进行运行时类型检查。 用于指针或引用从派生类转换为基类。...示例代码: int num = 10; double convertedNum = static_cast(num); Base* basePtr = newDerived(); Derived...示例代码: Base* basePtr = newDerived(); Derived* derivedPtr = dynamic_cast(basePtr); if (derivedPtr...它主要用于以下几种情况: 用于const或volatile指针或引用转换为非const或非volatile。 用于解除对象的const限制,以便在其上进行修改操作。...它主要用于以下几种情况: 用于一个指针类型转换为另一种不兼容的指针类型。 用于指针类型转换为整数类型或整数类型转换为指针类型,但需要注意平台相关性和安全性。

7010
  • Effective C++:规定27:尽量少做动作的过渡

    (3)reinterpret_cast(expression):试图运行低级转型(比如一个指向整数变量的指针转换为整数),实际动作及结果可能与编译器相关,因而减少了可移植性。...(四)唯一使用旧式转型的时机是当调用一个explicit构造函数一个对象传递给一个函数时: class Widget{ public: explicit Widget(int size);...{...}; class Derived : public Base{...}; Derived d; Base* pb = &d;//隐喻的derived*转换成Base* 在这里表明:单一的对象可能拥有一个以上的地址...这样的情况下会有个偏移量offset在执行期被施行于Derived*指针身上,用于取得正确的Base*指针值。 实际上一旦使用多重继承,这事差点儿一直发生.即使在单一继承中也可能发生.恐怖!...第一种方法: 使用容器并在当中存储直接指向derived class对象的指针(一般是智能指针)如此便消除了“通过base class接口处理对象”的须要。

    25120

    C++雾中风景14:CRTP, 模板的黑魔法

    它通过继承和模板的联合应用,实现了一种"看似"继承自己的语法。这种编程的技法,无论是在STL还是Boost之中都被大量使用。像它的名字一样,看起来很Curiously。...对象 std::shared_ptr getptr() { return std::shared_ptr(this); } }; 这里我们可以看到,...这里只是用到了模板派生,让父类能够在编译器感知到子类的模板存在,二者不是真正意义上的继承关系。 这里只分析下面两个问题: 为什么Bad类直接通过this构造shared_ptr会存在问题?...它就是一个典型的CRTP的使用,利用静态多态的方式。虚函数的调用转换为函数指针的调用,这个在实际聚合函数的实现过程之中能够大大提高计算的效率。...本篇介绍了一个模板使用的黑魔法:CRTP。它在高性能数据库,金融系统领域作为一种编程技法被大量使用。但是由于其怪异的语法,坦率来说对初学者并不友好。

    1.6K32

    从入门到精通:如何解决C++模板代码膨胀问题?

    策略说明 主要包括: 模板函数:提取通用部分 模板类:抽象出通用部分到基类 合理使用模板 小技巧:多用组合、避免使用大型对象等等。 1....模板函数的通用部分提取出来 如果模板函数中有一部分代码与模板参数无关,那么可以这部分代码提取出来,放到一个非模板函数中。这样,这部分代码只需要生成一次,而不是在每个模板实例中都生成一次。...std::dynamic_pointer_cast(): 这里主要是基类指针动态地转换为子类指针,可抽象出接口castToOriginType(),在里面进行类型转换,返回一个void类型的指针。...合理使用模板 不要为了用模板而用模板。...; }; 4.2 避免在模板函数中使用大型对象 模板函数中的对象会在每个模板实例中都生成一份,因此应该避免在模板函数中使用大型对象。

    64710

    现代C++之手写智能指针

    这是它的最大特点,所以他的拷贝构造函数和赋值运算符重载函数都只是声明而不定义,而且为了防止有的人在类外定义,所以函数声明为private。...::move(cl)); // ok uniqueunique } 小结: (1)我们需要了解子类向基类的隐式转换,通过移动构造函数变为带模板的移动构造函数,要明白两者共存情况与只有带模板的移动或者其他构造函数对编译器生成规则的影响...cout << "此时2个shared_ptr指向同一个资源" << endl; ptr2 = std::move(ptr1); if (!...(1)下行转换,基类转换为子类,例如:智能指针转换类似于shape* 转换为circle* 使用dynamic_cast转换后,指针为空.此时资源还是被dptr2拥有,dptr1为0。...(3)上行转换,子类基类,例如:智能指针转换类似于circle*转换为shape*,此时引用技术为两者共享。等价于static_cast。

    2.9K10

    CC++开发基础——智能指针

    标准库中提供了相应的类模板,它们可以任何数据类型封装成智能指针,使用它们时,需要引入头文件。...智能指针常用的类模板有: std::unique_ptr std::shared_ptr std::weak_ptr 由上述的类模板可以生成三种类型的智能指针实例。...std::move可以把一个智能指针所占有的资源转移给另一个智能指针。 shared_ptr包含一个显式的构造函数,可用于右值unique_ptr转换为shared_ptr。...转换成功以后,shared_ptr接管unique_ptr所占有的所有资源。因此,如果unique_ptr为右值(可以粗略理解为,位于赋值符号的右边)的时候,可以将其赋值给shared_ptr。...1.unique_ptrshared_ptr代码样例: std::shared_ptr p1 = std::make_unique(66); 完整C++代码实现: #include

    32020

    C++核心准则C.127:包含虚函数的类应该有虚析构函数或保护析构函数‍

    包含虚函数的类通常(大多数情况下)通过指向基类的指针使用。通常,最后一个使用者必须通过指向基类的指针调用delete操作,通常是指向基类的智能指针,因此析构函数应该是公开的虚函数。...virtual int f() = 0; // ... no user-written destructor, defaults to public nonvirtual ... }; // bad: derived...: std::shared_ptr p = std::make_shared(args); Here, the shared pointer will take care of deletion...也有一些人计划只通过shared_ptr使用类:std::shared_ptr p= std::make_shared(args);这段代码中共享指针会负责对象的销毁,因此不会因为不适当的销毁操作而引起内存泄露...但是准则还是重要的--如果某人使用make_unique申请内存会怎么样?

    77720
    领券