> 文档中心 > 成长随心记5

成长随心记5

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
              不要在构造和析构函数中调用虚函数,因为在构造和析构中对象是不完整的
              最好将基类的析构函数声明为虚函数