首页 > 编程语言 >C++ 智能指针类型转换测试

C++ 智能指针类型转换测试

时间:2024-07-17 17:08:35浏览次数:15  
标签:类型转换 std show derivedPtr C++ basePtr class 指针

这个是 GPT 回答的,可以运行。

#include <iostream>
#include <memory>

class Base {
public:
    virtual void show() const {
        std::cout << "Base class" << std::endl;
    }
    virtual ~Base() = default; // 确保基类有虚析构函数
};

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

#if false  // shared_ptr

int main() {
    // 创建一个 Derived 类的 shared_ptr
    std::shared_ptr<Derived> derivedPtr = std::make_shared<Derived>();

    // 上行转换:从派生类指针转换为基类指针
    std::shared_ptr<Base> basePtr = derivedPtr;
    basePtr->show(); // 输出 "Derived class"

    // 动态转换:从基类指针转换为派生类指针
    std::shared_ptr<Derived> derivedPtr2 = std::dynamic_pointer_cast<Derived>(basePtr);
    if (derivedPtr2) { // 如果转换成功
        derivedPtr2->show(); // 输出 "Derived class"
    }
    else {
        std::cout << "dynamic_pointer_cast 失败" << std::endl;
    }

    return 0;
}

#endif

#if true 

int main() {
    // 创建一个 Derived 类的 unique_ptr
    std::unique_ptr<Derived> derivedPtr = std::make_unique<Derived>();

    // 上行转换:从派生类指针转换为基类指针
    std::unique_ptr<Base> basePtr = std::move(derivedPtr);
    basePtr->show(); // 输出 "Derived class"

    // 自己新增测试 上面失去控制权之后,这里为 null,会进入 else
    // 不要使用失去控制权的指针对象
    if (derivedPtr)  
        derivedPtr->show();
    else
        std::cout << "拾取控制权,为 null。" << std::endl;

    // 动态转换需要手动进行,因为 unique_ptr 不直接支持 dynamic_pointer_cast
    // 但可以通过 raw pointer 实现
    Derived* rawPtr = dynamic_cast<Derived*>(basePtr.get());
    if (rawPtr) {
        rawPtr->show(); // 输出 "Derived class"
    }
    else {
        std::cout << "dynamic_cast 失败" << std::endl;
    }

    return 0;
}

#endif

输出:

Derived class
拾取控制权,为 null。
Derived class

标签:类型转换,std,show,derivedPtr,C++,basePtr,class,指针
From: https://www.cnblogs.com/huvjie/p/18307843

相关文章

  • 图解C++中的寻址。指针常量,常量指针。const int *p ,int * const p
    输出方式1.直接输出——采用直接寻址,输出内存块中的操作数,变量值变量名代替地址,容易记忆。intmain(){inta=10;//a=0x99fdcout<<a<<endl;//10,输出时系统采用直接寻址,输出a地址中存储的操作数return0;}2.取地址,&a——输出地址intmain()......
  • 指针的初步认识
    1.什么是指针?    1.1什么是数据/变量的地址        地址就是数据在内存中的存储位置。指针就是数据在内存中的存储地址,或者叫数据在内存中的编码位置。    1.2指针变量        用来存储指针/地址的变量叫做指针变量。 ......
  • 避免函数形参为空指针
    展示一个函数形参为空指针的隐患:执行第32行代码时,相当于执行double*pdPoint=pdTemp;,由于pdTemp=NULL,所以pdPoint=NULL。在然后 voidPointer(double*pdPoint,intiDim)函数中对pdPoint赋了一块动态内存,此时 pdPoint!=NULL,但是 pdPoint和pdTemp只是赋值......
  • C++ 《运算符重载》
    示例代码#include"iostream"//operator+usingnamespacestd;classA{public:intm_age;public:A(){}A(intage):m_age(age){}//Aoperator+(constA&a){//成员函数实现重载//Atemp(0);//temp.m_age=m_age+a.m_age;//......
  • c/c++ 浅拷贝与深拷贝
    浅拷贝与深拷贝的区别浅拷贝:简单的赋值拷贝操作深拷贝:在堆区重新申请空间,进行拷贝操作默认情况下对象拷贝是浅拷贝(深拷贝要自己实现拷贝函数)classPerson{public: //无参(默认)构造函数 Person(){ cout<<"无参构造函数!"<<endl; } //有参构造函数 Person(in......
  • 高质量C/C++编程指南总结(七)—— 内存管理
    1.内存分配的方式从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处......
  • C++扫雷小代码
    先声明一下:玩法介绍程序会提示输入:<ROW><COL><HEALTH><MINE_SUM>,分别代表行数,列数(均小于等于30),生命值(小于行数×列数),雷数(小于行数×列数),有数据判断操作符qpca+X,Y分别代表:在(x,y)²(见注释)翻开/插旗/撤销插旗/使用Ai(作为起始点)³,以下为详细介绍qxy:翻开位于......
  • 二叉苹果树(C++)
    【题目描述】有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点。这棵树共 N 个节点,标号1 至 N ,树根编号一定为 1 。我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵有四根树枝的苹果树,因为树枝太多了,需要剪枝。但是一些树枝上长有苹......
  • 小球掉落(C++)
    #include<bits/stdc++.h>usingnamespacestd;structnode{ intid; booldata; intfather; intlson,rson;};nodetree[6000000];intd,i;intmain(){ cin>>d>>i; tree[1].father=0; tree[1].lson=2; tree[1].rson=3; tree[1].data=false;......
  • 找树根和孩子(C++)
    【问题描述】 给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子【输入格式】第一行:n(结点数<=100),m(边数<=200)。以下m行;每行两个结点x和y,表示y是x的孩子(x,y<=1000)。【输出格式】第一行:树根:root。第二行:孩子最多的结点max。第三行:max的孩子,按照从小到大的顺......