虚函数是多态的基础 (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;
}