//***** 虚函数 ***** class Father { public: virtual void run() //virtual是C++里面的关键字,代表该函数是虚函数 { std::cout << "父亲可以跑万米!" << std::endl; } void jump() { std::cout << "父亲可以跳五个台阶!" << std::endl; } }; class Son:public Father { public: void run() { std::cout << "儿子可以跑十万米!" << std::endl; } void jump() { std::cout << "儿子可以跳十个台阶!" << std::endl; } }; //***** 虚函数使用 ***** void test1() { Father *p1 = new Son; p1->run(); p1->jump(); delete(p1); p1 = NULL; Son *p2 = new Son; p2->run(); p2->jump(); delete(p2); p2 = NULL; // run()函数在没有添加virtual关键字之前的输出: /* 输出: 父亲可以跑万米! 父亲可以跳五个台阶! 儿子可以跑十万米! 儿子可以跳十个台阶! */ Father *p3 = new Son; p3->run(); p3->jump(); delete(p3); p3 = NULL; Son *p4 = new Son; p4->run(); p4->jump(); delete(p4); p4 = NULL; // run()函数在添加virtual关键字之后的输出: /* 输出: 儿子可以跑十万米! 父亲可以跳五个台阶! 儿子可以跑十万米! 儿子可以跳十个台阶! */ /* 虚函数: 为什么两种的情况不相同呢,这是因为在run()函数前面加了关键字virtual,表示该函数是虚函数 虚函数,实际上表示该函数是多种形态的,即函数可以被多个对象所拥有,而且功能不一,换句话说,就是多个对象在调用同一个名字的函数时, 会产生不同的效果。系统在执行virtual函数时,会自动判断是哪个对象调用了它,然后调用该对象的同名函数。 */ }
//***** 虚函数原理 ***** class player // 选手 { public: virtual void beat() { std::cout << "一般选手的力量为260磅" << std::endl; } protected: int age; }; class Ali:public player // 阿里 { public: void beat() { std::cout << "阿里一拳的力量为420磅" << std::endl; } }; class Lewis:public player // 刘易斯 { public: void beat() { std::cout << "刘易斯一拳的力量为480磅" << std::endl; } }; class Tyson:public player // 泰森 { public: void beat() { std::cout << "泰森一拳的力量为500磅" << std::endl; } }; void test1() { player *p[4]; player *p1 = NULL; int choice; for(int i = 0; i < 4; i ++) { std::cout << "(1)阿里(2)刘易斯(3)泰森:"; std::cin >> choice; switch(choice) { case 1: p1 = new Ali; break; case 2: p1 = new Lewis; break; case 3: p1 = new Tyson; break; default: p1 = new player; break; } p[i] = p1; p[i]->beat(); delete(p[i]); p[i] = NULL; } }