1,类所占的空间大小
1)类的成员函数不占用类的内存,类的内存是靠成员变量决定的(静态成员变量除外),虚函数指针和虚基类指针也属于数据部分
2)同一个类的不同的对象共用同一份成员函数代码
2,多态,C++三大特性之一
1)多态有两类,一个是静态多态:如函数的重载,运算符的重载等
一个是动态多态:派生类和虚函数实现的运行时的多态
2)区别:静态多态是早绑定,编译时确定地址
动态多态是晚绑定,运行时确定地址
3)多态的满足条件:有继承关系 ,子类重写父类的虚函数,(虚函数:成员函数前加virtual)(重写:函数返回类型,函数名,参数列表完全一样)
4)多态的使用:父类指针或引用指向子类的对象
5)例:class animal {
public:
virtual void speak() = 0;//纯虚函数:
};
class cat :public animal {//子类继承父类
virtual void speak() {//子类重写父类的虚函数
cout << "猫叫" << endl;
}
};
int main()
{
animal* p = new cat;//父类指向子类对象的指针
p->speak();
}
6)多态的好处:组织结构强,可读性强,对于前期和后期维护和扩展性高
3,虚函数和纯虚函数
作用:用于类的动态多态
纯虚函数:例:virtual void speak() = 0;
注意:纯虚函数只是声明,不能被调用,他没有函数的实现
4,虚析构和纯虚析构
作用:解决父类指针在析构时,不会调用子类的析构函数问题
语法:虚析构:virtual ~子类名
纯虚析构:virtual~子类名()=0;
注意:二者都需要有函数的实现
这个类都属于抽象类,无法实例化对象
5,抽象类
含义:即类中含有虚函数的基类
作用:作为一个类族的基类
注意:不能用来命名对象,如果子类没有重写基类,则子类也不能用来实例化对象
如果在类外定义虚函数,只需要在声明处加virtual
不要在构造和析构函数中调用虚函数,因为在构造和析构中对象是不完整的
最好将基类的析构函数声明为虚函数