#include计算器#include using namespace std; //多态(动态多态->派生类和虚函数) //条件:有继承关系,子类重写父类虚函数(virtual) class an { public: virtual void shuohua() {//虚函数 cout << "动物会说话:" << endl; } }; class cat : public an { public: void shuohua() { cout << "喵喵喵" << endl; } }; class dog : public an { public: void shuohua() { cout << "汪汪汪" << endl; } }; //void shuo(an& ann)【地址早绑定 编译阶段就确定了函数地址】 void shuo(an& ann) {//父类引用或指针 ann.shuohua(); } int main() { an a; shuo(a); cat ca; shuo(ca); dog doo; shuo(doo); }
创建父类并用父类创建子类对象
jisuanji* ab;//创建父类 case '+' : ab = new jiafa;//用父类指针创建子类对象
#include#include using namespace std; //多态实现计算器 //对拓展进行开放,对修改进行关闭 class jisuanji { public: virtual int get() { return 0; } int num_1, num_2; }; class jiafa : public jisuanji { public: int get() { return num_1 + num_2; } }; class jianfa : public jisuanji { public: int get() { return num_1 - num_2; } }; class chengfa : public jisuanji { public: int get() { return num_1 * num_2; } }; class chufa : public jisuanji { public: int get() { return num_1 / num_2; } }; void ceshi() { cout << "input type:(+.-.*./):" << endl; char leixing; cin >> leixing; switch (leixing) { jisuanji* ab;//创建父类 case '+' : ab = new jiafa;//用父类指针创建子类对象 cin >> ab->num_1; cin >> ab->num_2; cout << ab->num_1 << "+" << ab->num_2 << "=" << ab->get () << endl; delete ab; //new的数据要delete销毁(不销毁os也会销毁) break; case '-':ab = new jianfa; cin >> ab->num_1; cin >> ab->num_2; cout << ab->num_1 << "-" << ab->num_2 << "=" << ab->get() << endl; delete ab; break; case '*':ab = new chengfa; cin >> ab->num_1; cin >> ab->num_2; cout << ab->num_1 << "*" << ab->num_2 << "=" << ab->get() << endl; delete ab; break; case '/':ab = new chufa; cin >> ab->num_1; cin >> ab->num_2; cout << ab->num_1 << "/" << ab->num_2 << "=" << ab->get() << endl; delete ab; break; } } int main() { ceshi(); ceshi(); ceshi(); ceshi(); }
//纯虚函数(有一个就是抽象类)
virtual void shuohua() = 0;
//无法实例化对象-> an a|new an会报错
//抽象类的子类必须重写父类的纯虚函数(否则子类不能实例化对象)
#include#include using namespace std; //纯虚函数->抽象类 class an { public: //纯虚函数(有一个就是抽象类) virtual void shuohua() = 0; //无法实例化对象-> an a|new an会报错 //抽象类的子类必须重写父类的纯虚函数(否则子类不能实例化对象) }; class cat : public an { public: void shuohua() {//必须重新纯虚函数 cout << "喵喵喵" << endl; } }; class dog : public an { public: void shuohua() { cout << "汪汪汪" << endl; } }; void shuo(an& ann) {//父类引用或指针 ann.shuohua(); } int main() { cat ca; shuo(ca); dog doo; shuo(doo); }



