虚函数
virtual修饰的成员函数就是虚函数,
1.虚函数对类的内存影响:增加一个指针类型大小(32位和64位)
2.无论有多少个虚函数,只增加一个指针类型
虚函数表:指向虚函数的指针(监视的窗口看)
我们自己也可以通过虚函数指针表去访问函数(一般做这样的说数据操作,不写数据类型)
include<iostream> #include<string> using namespace std; class MM { public: virtual void print() { cout << "第一个虚函数" << endl; } virtual void printDate() { cout << "第二个虚函数" << endl; } private: int age; string name; }; int main() { cout << sizeof(MM) << endl; system("pause"); return 0; }
抽象类
拥有一个或一个以上的纯虚函数就被叫做抽象类
特点:
1.抽象类不能够创建对象
2.抽象类可以创建对对象指针
纯虚函数
纯虚函数也是一个虚函数,所以也需要virtual来修饰
特点:
1.纯函数没有函数体
所以函数 = 0;
#include<iostream> #include<string> using namespace std; class MM { public: virtual void print() = 0; //纯虚函数 private: int age; }; int main() { //MM mm; //抽象类不能够构造对象 MM* pmm = nullptr; return 0; }
虚析构函数
在析构函数前面加一个virtual
1.当父类指针对子类对象进行初始化的时候,就要用虚析构函数
2.所有析构函数底层解析的话。函数名想相同
include<iostream> #include<string> using namespace std; class MM { public: void print() { cout << "MM" << endl; } ~MM() { cout << "MM析构" << endl; } protected: string M_name; }; class son : public MM { public: void print() { cout << "son" << endl; } ~son() { cout << "son析构" << endl; } }; int main() { MM* p = new son; //父类指针,构造子类对象,先构造父类对象,在构造子类的对象 delete p; system("pause"); return 0; }
只调用了父类的析构函数,没有调用子类的析构函数,存在内存的泄露。
所以用父类指针初始化子类的对象,必须使用虚虚构函数
#include<iostream> #include<string> using namespace std; class MM { public: void print() { cout << "MM" << endl; } virtual ~MM() { cout << "MM析构" << endl; } protected: string M_name; }; class son : public MM { public: void print() { cout << "son" << endl; } ~son() { cout << "son析构" << endl; } }; int main() { MM* p = new son; //父类指针,构造子类对象,先构造父类对象,在构造子类的对象 delete p; system("pause"); return 0; }