美文网首页
C++中多态实现的例子

C++中多态实现的例子

作者: 九楼记 | 来源:发表于2022-06-18 23:37 被阅读0次

    先看一段代码

    #include <iostream>
    using namespace std;
    class Base {
    public:
        void Run() {
            cout << "Base run" << endl;
        }
    };
    
    class Derive : public Base {
    public:
        void Run() {
            cout << "Derive run" << endl;
        }
    };
    
    void CallFunc(Base *p) {
        p->Run();
    }
    
    int main() {
        Base *p = new Base();
        Derive *d = new Derive();
        CallFunc(p);
        CallFunc(d);
        delete p;
        delete d;
        return 0;
    }
    

    实际运行结果,都是调用Base的Run方法,预期是p调用Base,d调用Dervie。
    原来具体执行哪个函数,由CallFunc的参数决定。
    可以用下面的代码验证

    #include <iostream>
    using namespace std;
    class Base {
    public:
        void Run() {
            cout << "Base run" << endl;
        }
        virtual void Print() {}
    };
    
    class Derive : public Base {
    public:
        void Run() {
            cout << "Derive run" << endl;
        }
    };
    
    void CallFunc(Derive *p) {
        p->Run();
    }
    
    int main() {
        Base *p = new Base();
        Derive *d = new Derive();
        CallFunc(dynamic_cast<Derive*>(p));
        CallFunc(d);
    
        delete p;
        delete d;
        return 0;
    }
    

    那怎么可以达到我们的预期效果呢?

    方法1:虚函数

    #include <iostream>
    using namespace std;
    class Base {
    public:
        virtual void Run() {
            cout << "Base run" << endl;
        }
    };
    
    class Derive : public Base {
    public:
        void Run() {
            cout << "Derive run" << endl;
        }
    };
    
    void CallFunc(Base *p) {
        p->Run();
    }
    
    int main() {
        Base *p = new Base();
        Derive *d = new Derive();
        CallFunc(p);
        CallFunc(d);
    
        delete p;
        delete d;
        return 0;
    }
    

    方法2:函数模版

    #include <iostream>
    using namespace std;
    class Base {
    public:
        void Run() {
            cout << "Base run" << endl;
        }
    };
    
    class Derive : public Base {
    public:
        void Run() {
            cout << "Derive run" << endl;
        }
    };
    
    void CallFunc(Base *p) {
        p->Run();
    }
    
    template <typename T>
    void CallFunc2(T *p) {
        p->Run();
    }
    
    int main() {
        Base *p = new Base();
        Derive *d = new Derive();
    
        CallFunc2<Base>(p);
        CallFunc2<Derive>(d);
    
        delete p;
        delete d;
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C++中多态实现的例子

          本文链接:https://www.haomeiwen.com/subject/hiilvrtx.html