虚函数是多态的基础 (PS多态是一个接口多个实现) 多态条件:1.继承 2. 虚函数 3. 父类指针指向子类
#include<iostream> using namespace std; class myclass { public: virtual void go() { cout << "myclass" << endl; } virtual void go1() { cout << "myclass1" << endl; } virtual void go2() { cout << "myclass2" << endl; } }; class classX:public myclass { public: void go() { cout << "classX" << endl; } }; class classY :public myclass { public: void go() { cout << "classY" << endl; } }; int main() { myclass *p; p= new classX; p->go(); p = new classY; p->go(); cin.get(); return 0; } //其中sizeof(myclass) 为4,无论有多少虚函数构造函数不能为虚函数,如果是虚函数,子类无法对父类进行初始化 析构函数能为虚函数, 如果使用多态,析构函数必须为虚函数,否则会造成内存泄露 虚构中:父类指针调用子类子类的析构,子类析构自动调用父类的析构 //使用多态、析构函数不是多态会造成严重的内存泄露, 因为只会完成父类的析构
#include<iostream> using namespace std; class myclass { public: char *p; public: myclass() { p = new char[1024 * 1024 * 100]; } ~myclass() { delete[]p; } virtual void go() { cout << "myclass" << endl; } virtual void go1() { cout << "myclass1" << endl; } virtual void go2() { cout << "myclass2" << endl; } }; class classX:public myclass { public: int *p; classX() { p = new int[1024 * 1024 * 100]; } ~classX() { delete[] p; } void go() { cout << "classX" << endl; } }; class classY :public myclass { public: void go() { cout << "classY" << endl; } }; int main011() { myclass *p; p= new classX; p->go(); p = new classY; p->go(); cin.get(); return 0; } int main() { myclass *p; p = new classX; p->go(); delete p; cin.get(); return 0; }