运行时多态的实现-虚函数

运行时多态的实现-虚函数

多态分为编译时多态和运行时多态;编译时多态为重载和模板,运行时多态是通过虚函数实现的。
例如我们看下面一个例子:
我们定义一个指向基类的指针,但是我们希望通过对于不同的对象可以有不同的输出结果。

class Base
{
public:
    Base(string data) :m_data(data){}
    void show(){ cout << "Base:: " << m_data << endl; }
    string GetData(){ return m_data; }
private:
    string m_data;
};

class Derived :public Base
{
public:
    Derived(int id, string data) : m_id(id), Base(data){ }
    void show(){ cout << "Derived:: " << m_id<<"  " << GetData() << endl; }
private:
    const int m_id;
};

int main()
{
    Base *A = new Base("hello");        //指向基类对象的指针
    A->show();
    Base *B = new Derived(1, "hello");  //指向派生类对象的指针
    B->show();;
//对于这两个指针,我们希望它们分别对应基类和派生类的 show()函数
    system("pause");
    return 0;
}

运行结果:
这里写图片描述
此时可以发现:并没有如我们预想的那样,基类的show()函数遮蔽了派生类的show()函数,原因在于我们没有使用虚函数,虚函数是实现运行是多态。
所以想要实现运行时多态,很简单,只需要将基类的show()前加上virtual 关键字即可。

class Base
{
public:
    Base(string data) :m_data(data){}
    virtual void show(){ cout << "Base:: " << m_data << endl; }
    string GetData(){ return m_data; }
private:
    string m_data;
};

此时边得到我们想要的结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhoujy1996/article/details/80587019