一、类
1、public,private,protected访问权限
(1)public
可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问
(2)private
只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问
(3)protected
可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问
2、public,private,protected继承访问权限
public
对于公有继承方式:
(1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的protected成员,只允许子类成员访问;
(一)基类成员对其对象的可见性:
公有成员可见,其他不可见。这里保护成员同于私有成员。
(二)基类成员对派生类的可见性:
公有成员和保护成员可见,而私有成员不可见。这里保护成员同于公有成员。
(三)基类成员对派生类对象的可见性:
公有成员可见,其他成员不可见。
所以,在公有继承时,派生类的对象可以访问基类中的公有成员;
派生类的成员函数可以访问基类中的公有成员和保护成员。这里,
一定要区分清楚派生类的对象和派生类中的成员函数对基类的访问是不同的。
private
对于私有继承方式:
(1)父类的public成员成为子类的private成员,只允许子类成员访问;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的private成员,只允许子类成员访问;
(一)基类成员对其对象的可见性:
公有成员可见,其他成员不可见。
(二)基类成员对派生类的可见性:
公有成员和保护成员是可见的,而私有成员是不可见的。
(三)基类成员对派生类对象的可见性:
所有成员都是不可见的。
所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。
protected
对于保护继承方式:
(1)父类的public成员成为子类的protected成员,只允许子类成员访问;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的protected成员,只允许子类成员访问;
这种继承方式与私有继承方式的情况相同。 两者的区别仅在于对派生类的成员而言, 对基类成员有不同的可见性。
**上述所说的可见性也就是可访问性。
关于可访问性还有另的一种说法。
这种规则中,称派生类的对象对基类访问为水平访问,称派生类的派生类对基类的访问为垂直访问。
一般规则如下:
公有继承时,水平访问和垂直访问对基类中的公有成员不受限制;
私有继承时,水平访问和垂直访问对基类中的公有成员也不能访问;
保护继承时,对于垂直访问同于公有继承,对于水平访问同于私有继承。
3、静态
(1)类的对象可以使用静态成员函数和非静态成员函数。
(2)不能通过类名来调用类的非静态成员函数,但可以调用静态成员函数。
(3)静态成员函数中不能调用非静态成员。
(4)非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对
象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。
(5)静态成员变量使用前必须先初始化(如int MyClass::m_iNum = 0;),否则会在linker时出错。
4、多态性
4.1、虚函数
(1)虚函数为了实现多态
(2)一个父类有多个子类,每个子类重写父类虚函数,其函数体实现内容可能不一样。
父类指针对象指向的子类不同,调用函数实现内容也不同。
(3)这些函数不能为虚函数:普通函数(非成员函数)、静态成员函数、内联成员函数、构造函数、友元函数
4.2、纯虚函数
(1)凡是含有纯虚函数的类叫做抽象类
(2)抽象类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实
现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。
(3)抽象类不能定义对象,但可以定义指针和引用。该指针和引用可以指向它的继承类实现多态。
4.3、C++支持两种多态性:编译时多态性,运行时多态性。
(1)编译时多态性:通过重载函数和运算符重载实现。
(2)运行时多态性:通过虚函数和继承实现。
5、类型转换(父类对象和子类对象)
(1)、子类对象可以赋给父类对象:
子类从父类继承了所有的方法和属性,那么父类有的子类都有,所以子类可以给父类的赋值。
(2)、父类对象不能赋给子类对象:
虽然子类继承了父类所有的方法和属性,但是子类新增了自己的方法和属性,此时将父类对象
赋给子类,那么子类中新的方法将无法操作。
(3)、子类赋给父类,如果调用的是普通函数,那么调用的函数是父类的;如果调用的是虚函数,
那么调用的是子类中的,此时是多态形式。