运行时多态的实现-虚函数
多态分为编译时多态和运行时多态;编译时多态为重载和模板,运行时多态是通过虚函数实现的。
例如我们看下面一个例子:
我们定义一个指向基类的指针,但是我们希望通过对于不同的对象可以有不同的输出结果。
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;
};
此时边得到我们想要的结果: