C++中多态实现的例子

2022-06-18  本文已影响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;
}
上一篇 下一篇

猜你喜欢

热点阅读