1,访问属性
区分内部可见(成员函数对数据成员的访问)和外部可见(对象对成员的访问)
1)public:内部和外部皆可见
2)private:内部可见,外部不可见
3)protected:内部可见,继承类的内部可见,外部不可见
继承属性:
public类型的继承:在子类中,原来public,protected,private等依旧为public,protected,private
protect类型的继承:在子类中,原来public,protected,private等变为protected,protected,不可见
private类型的继承:在子类中,原来public,protected,private等变为private,private,不可见
结合访问属性和继承属性,就可以推导处各种情况下的访问权限问题。其中private只能在父类内部调用,对于其他都是不可见的。
2,继承的二义性
1)一个指向基类的指针可以指向该类的任何派生类对象,这是c++实现多态的关键
2)可以把基类的指针/引用强制转换为派生类的指针/引用,这再java里面是不容许的,但再c++里面,利用该指针再调用子类具有,基类没有的属性的时候,居然不报错,实在很神奇。
3,虚函数与多态
c++中的虚函数可以被对象正常调用,纯虚函数才类似于java里的抽象函数。一旦基类声明虚函数,那么不管子类有没有virtual,都为虚函数。
多态是指同一个操作作用于不同的对象会产生不同的相应,分为静态多态和动态多态。
静态多态发生在编译阶段,如函数重载。(通过不同对象调用对应函数本质上不叫多态)
动态多态发生在运行阶段,通过虚函数和指针/引用来实现。
(使用指针访问非虚函数时候,编译器根据指针本身类型决定调用哪个函数;使用指针访问虚函数的时候,编译器根据指针指向的对象类型决定调用哪个函数)。因此:实现动态多态需要满足两个条件:
1)成员函数声明为虚函数
2)使用指向基类类型的指针或者引用进行函数调用
4,c++类的内存布局
1)对于一个类来说,类里面的static数据成员存放在所有对象之外,非static成员被配置到每个对象。不会对对象占用的内存造成影响。
2)类里面的成员函数也放置在所有对象之外,如果类包含虚函数,那么编译系统给每一个对象一个虚函数指针(ptr),指向每个对象自己的虚函数表。虚函数表中记载的是对应需要调用函数的入口地址。