首页 > 代码库 > C++面向对象编程

C++面向对象编程

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),指向每个对象自己的虚函数表。虚函数表中记载的是对应需要调用函数的入口地址。