徐州网站定制公司,成都网站编辑,安徽建设工程信息网文件,淘宝网站建设方式1.继承会将所有的成员继承下来#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承#xff0c;那么他不论哪里都是不可见的#xff1b;如果是protected继承在类中是可见的#xff0c;在类外是不可见的#xff1b;如果是public继承#xff0c;在任何… 1.继承会将所有的成员继承下来但是继承方式限定的是继承下来成员的可见类型(如果是private继承那么他不论哪里都是不可见的如果是protected继承在类中是可见的在类外是不可见的如果是public继承在任何地方都是可见的 2.对于静态成员变量不计入字节大小 3.虚函数类外定义时不必加virtual 4.编译时多态——静态多态——模板和重载 运行时多态——动态多态——虚函数 友元函数 构造函数 static静态函数 不能用virtual关键字修饰 普通成员函数 和析构函数 可以用virtual关键字修饰 静态成员变量类内声明类外初始化 静态成员变量为什么不能设置为虚函数 静态成员函数不属于任何成员属于整个类不能使用this来访问 virtual构成的虚函数恰恰是使用this指针访问this-vfptr- 虚函数地址 静态成员函数没有this指针实现多态就是需要不同的对象调用不同的子类进行访问不同的重写函数 class A
{static int _tem;//静态成员变量类内声明类外初始化
};int A::_tem 0;//在类外初始化的时候不加static静态成员变量会继承使用权但是不能被包含 静态成员变量不存储在类中计算类的大小的时候不计算他的字节大小 重载同一个作用域中函数名相同参数类型不同参数数量不同参数顺序不同 重定义隐藏继承中函数名相同可使用作用域进行访问 重写覆盖继承的虚函数中子类重写父类的虚函数 派生类的构造函数不写会调用默认的构造函数但是如果自己写就要自己调用父类的构造函数在调用父类的构造函数时要将父类当成一个整体 class Base
{
public:Base(){puts(Base());}Base(int a):_a(a){puts(Base(int a));}Base(const Base tem){puts(Base(const Base tem));}Base operator(const Base tem){puts(Base operator(const Base tem));_a tem._a;return *this;}~Base(){puts(Base);}
private:int _a;
};
class Son:public Base
{
public:Son(){puts(Son());}Son(int a, int b):Base(a),_b(b){puts(Son(int a,int b));}Son(const Son tem):Base(tem){//父类接受子类的对象/引用/指针puts(Son(const Son tem));}Son operator(const Son tem){puts(Son operator(const Son tem));Base::operator(tem);return *this;}~Son(){//在析构函数的时候可以不手动调用析构函数//编译器会自动调用父类的析构函数puts(~Son());}
private:int _b;
};inline能不能是虚函数可以内敛函数没有地址 多态调用内敛不起作用多态调用中虚函数存在虚函数表中需要地址但是内联函数没有地址所以内敛不起作用 普通调用内敛起作用 构造函数能不能是虚函数不能 虚表是在编译时生成构造的时候进行初始化 如果构造函数是虚函数那么在实例化对象的时候如何应该去虚表中找构造函数的地址但是这时候虚表还没有初始化 多态调用和普通函数的时间效率 具体要看是否构成多态调用需要到需表中找地址进行调用普通成员函数可以直接调用 多态的本质——虚表 当父类的指针/引用接收子类的地址/对象时因为是继承会进行切割将子类的父类那部分切出来剩下的就是去虚表中找地址进行调用就行了 父类子类会将父类的那部分切出来拷贝给父类但是不会拷贝虚函数表指针 虚函数指针如果进行了拷贝那么父类对象的虚函数表指针会发生改变当使用父类对象调用父类的虚函数时就会发生错误 虚函数继承继承的是接口参数类型不会改变当子类对象要调用父类的函数时使用切片的手法进行调用 普通函数继承继承的是实现 子类和父类都有虚函数子类的虚函数会存到哪里 从右表中可以看到应该是有三个虚函数他们在同一个虚表中 子类中没有虚表子类的虚函数存到父类的虚表中 可以记成向上合并