c++ 智能指针 shared_ptr 在多态上的使用

Posted Ajanuw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 智能指针 shared_ptr 在多态上的使用相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <memory>

using namespace std;

class Base { public: virtual ~Base() = default; /* 使其多态 */ };
class A : public Base { public:void show1() { printf("1\\n"); } };
class B : public Base { public:void show2() { printf("2\\n"); } };


void f(shared_ptr<Base> c)
{
  if (dynamic_pointer_cast<A>(c).get())
  {
    static_pointer_cast<A>(c)->show1();
  }
  else if (dynamic_pointer_cast<B>(c).get())
  {
    static_pointer_cast<B>(c)->show2();
  }
}

int main()
{
  auto c1 = make_shared<A>();
  auto c2 = make_shared<B>();
  f(move(c1));
  f(move(c2));
}

对比原始指针

#include <iostream>
#include <memory>

using namespace std;

enum class CT { A, B };
class Base { public: virtual CT id() const = 0;  virtual ~Base() = default; /* 使其多态 */ };
class A : public Base { public:void show1() { printf("1\\n"); }; CT id() const override { return CT::A; } };
class B : public Base { public:void show2() { printf("2\\n"); }; CT id() const override { return CT::B; } };


void f(Base* c)
{
  switch (c->id())
  {
  case CT::A:
    reinterpret_cast<A*>(c)->show1();
    break;
  case CT::B:
    reinterpret_cast<B*>(c)->show2();
    break;
  }
}

int main()
{
  auto c1 = new A();
  auto c2 = new B();
  f(c1);
  f(c2);
  delete c1;
  delete c2;
}

See alse:

以上是关于c++ 智能指针 shared_ptr 在多态上的使用的主要内容,如果未能解决你的问题,请参考以下文章

C++智能指针

C++智能指针

C++智能指针shared_ptr 定位删除器(仿函数)

C++智能指针详解:shared_ptr

C++智能指针之shared_ptr与右值引用(详细)

C++智能指针之shared_ptr与右值引用(详细)