---- 整理自狄泰软件唐佐林老师课程

p->print()不符合预期,期望调用子类中的print,实际调用父类的print


通过使用 virtual关键字 对多态进行支持
被virtual声明的函数被重写后具有多态 特性
被virtual声明的函数叫做 虚函数
#include
#include using namespace std;class Parent
{
public:virtual void print(){cout << "I'm Parent." << endl;}
};class Child : public Parent
{
public:void print(){cout << "I'm Child." << endl;}
};void how_to_print(Parent* p)
{p->print(); // 展现多态的行为
}int main()
{Parent p;Child c;how_to_print(&p); // Expected to print: I'm Parent.how_to_print(&c); // Expected to print: I'm Child.return 0;
}

静态联编:
动态联编:
实例分析:动态联编和静态联编
#include
#include using namespace std;class Parent
{
public:virtual void func(){cout << "void func()" << endl;}virtual void func(int i){cout << "void func(int i) : " << i << endl;}virtual void func(int i, int j){cout << "void func(int i, int j) : " << "(" << i << ", " << j << ")" << endl;}
};class Child : public Parent
{
public:void func(int i, int j){cout << "void func(int i, int j) : " << i + j << endl;}void func(int i, int j, int k){cout << "void func(int i, int j, int k) : " << i + j + k << endl;}
};void run(Parent* p)
{p->func(1, 2); // 展现多态的特性// 动态联编
}int main()
{Parent p;p.func(); // 静态联编p.func(1); // 静态联编p.func(1, 2); // 静态联编cout << endl;Child c;c.func(1, 2); // 静态联编cout << endl;run(&p);run(&c);return 0;
}

#include
#include using namespace std;class Boss
{
public:int fight(){int ret = 10;cout << "Boss::fight() : " << ret << endl;return ret;}
};class Master
{
public:virtual int eightSwordKill(){int ret = 8;cout << "Master::eightSwordKill() : " << ret << endl;return ret;}
};class NewMaster : public Master
{
public:int eightSwordKill(){int ret = Master::eightSwordKill() * 2;cout << "NewMaster::eightSwordKill() : " << ret << endl;return ret;}
};void field_pk(Master* master, Boss* boss)
{int k = master->eightSwordKill();int b = boss->fight();if( k < b ){cout << "Master is killed..." << endl;}else{cout << "Boss is killed..." << endl;}
}int main()
{Master master;Boss boss;cout << "Master vs Boss" << endl;field_pk(&master, &boss);cout << "NewMaster vs Boss" << endl;NewMaster newMaster;field_pk(&newMaster, &boss);return 0;
}
