虚函数和虚函数表
1.用virtual修饰的成员函数叫虚函数
2.空的类或者结构体占用1个字节,若只有虚函数,则占4个字节(32位)
3.虚函数表:一个指针存储所有虚函数的首地址
#include <iostream>
using namespace std;
class A
{
public:
protected:
};
class B
{
public:
virtual void print();
protected:
};
class C
{
public:
int num;
protected:
};
void B::print()
{
cout << "虚函数" << endl;
}
int main()
{
cout << sizeof(A) << endl;//1
cout << sizeof(B) << endl;//4
cout << sizeof(C) << endl;//4
return 0;
}
多态
注:无virtual看指针,有virtual看赋值对象
1.定义:同一种行为(调用)导致的不同的结果
2.父类必须存在虚函数
3.子类必须采用public继承
4.子类存在同名函数
5.必须存在指针的引用
#include <iostream>
using namespace std;
class A
{
public:
void print1()
{
cout << "无virtual的父类函数" << endl;
}
virtual void print2()
{
cout << "有virtual的父类函数" << endl;
}
protected:
};
class B:public A
{
public:
void print1()
{
cout << "无virtaul的子类同名函数"<<endl;
}
void print2()
{
cout << "有virtual的子类同名函数" << endl;
}
protected:
};
int main()
{
A* a = new B;
a->print1(); //无virtual的父类函数
a->print2(); //有virtual的子类同名函数
return 0;
}
纯虚函数和ADT
1.纯虚函数也是虚函数,只是纯虚函数没有函数体
virtual void print()=0;
2.纯虚函数就是做ADT(abstract data type抽象数据类型)过程
3.抽象类:具有至少一个纯虚函数的类,叫抽象类
(1)抽象类不能构建对象
(2)抽象类可构建对象指针
4.纯虚函数没有被重写,无论被继承多少次都是纯虚函数
5.一般抽象类只被继承一次就重写
虚析构函数
在用子类对象初始化父类指针,父类需要虚析构函数做子类内存申请的释放
#include <iostream>
using namespace std;
class A
{
public:
virtual ~A()
{
cout << "父类虚析构" << " ";
}
protected:
};
class B :public A
{
public:
~B()
{
cout << "子类析构" << " ";
}
protected:
};
int main()
{
A* a = new B;
delete a;
//子类析构 父类虚析构
return 0;
}