zoukankan      html  css  js  c++  java
  • 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
    "); } };
    class B : public Base { public:void show2() { printf("2
    "); } };
    
    
    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
    "); }; CT id() const override { return CT::A; } };
    class B : public Base { public:void show2() { printf("2
    "); }; 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:

  • 相关阅读:
    23种设计模式-桥接模式
    23种设计模式-单列模式
    23种设计模式-迭代器模式
    23种设计模式-组合模式
    23种设计模式-备忘录模式
    23种设计模式-适配器模式
    23种设计模式-状态模式
    SVN的安装和应用
    线程、线程池
    条形码
  • 原文地址:https://www.cnblogs.com/ajanuw/p/14853841.html
Copyright © 2011-2022 走看看