zoukankan      html  css  js  c++  java
  • [瞎JB写] C++多态

    似乎只能通过引用或者指针进行动态多态。。。蛋疼的语法

    #include <iostream>
    #include <vector>
    #include <memory>
    using namespace std;
    
    class A {
    public:
        virtual void init() = 0;
    };
    
    class B : public A {
    public:
        void init() {
            cout << "B init" << endl;
        }
    };
    
    class C :public B {
    public:
        void print() {
            cout << "C -> B" << endl;
        }
        void init() {
            cout << "C init" << endl;
        }
    };
    
    class D : public A {
    private:
        int wow;
    public:
        D() { wow = 0; }
        D(int a) :wow(a) {}
        void init() {
            cout << "D init" << endl;
        }
        void print() {
            cout << "D -> A" << wow << endl;
        }
    };
    
    int main() {
        vector<shared_ptr<A>> list;
        list.push_back(make_shared<C>());
        list.push_back(make_shared<D>(1));
        for (auto &item : list) {
            item->init();
        }
        ((D*)list[1].get())->print();
        return 0;
    }

    这样就可以实现所有物体放在一个容器里。。。

    但是缺点也是显而易见的,如果强制转换到了错误的类,后面使用的时候就会出问题。

    所以不能这么粗暴的转换,有一表达式可以帮助我们:

    dynamic_cast

      #define PTR_CONVERT(shared_ptr, type) (dynamic_cast<type*>(shared_ptr.get()))

    PTR_CONVERT(list[0], C)->print();
    PTR_CONVERT(list[1], D)->print();
  • 相关阅读:
    BZOJ 4025: 二分图
    20180803 题解 Winniechen's Tesst
    前尘浮华一场梦 NOI2018 游记
    UOJ#311. 【UNR #2】积劳成疾
    欢迎到我的新Blog!
    弹飞大爷 BZOJ4764 LCT维护内向基环树森林
    [SCOI2007]修车 BZOJ1070
    KD-Tree
    CDQ分治
    深入解析DC/OS 1.8 – 高可靠的微服务及大数据管理平台
  • 原文地址:https://www.cnblogs.com/makejeffer/p/5533544.html
Copyright © 2011-2022 走看看