数据抽象,继承,动态绑定
(1)在C++中,通过基类的指针或引用调用虚函数时发生动态绑定,既可以指向基类对象也可以指向派生类对象
这一事实是发生动态绑定的关键。用引用或指针调用的虚函数在运行时确定,被调用的函数是引用或指针所指对象
的实际类型。
(2)任意的非static成员函数都可以是虚函数,虚函数virtual字眼只能出现在类体里面
访问控制:
(1)private成员:基类的private成员只能由基类的成员函数和友元访问。
(2)派生类只能访问基类的public成员而不能访问private(访问权限与其他程序一样)
(3)protected成员:派生类可以访问,但其他普通用户仍不能访问。
(4)派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类对象的protected成员,没有特殊的
访问权限。
派生类:
(1)派生类的虚函数的声明必须与基类的虚函数的定义完全匹配,但是有一个例外,当基类的虚函数返回基类型指针或引用时
派生类可以返回派生类类型的指针或引用。
(2)每个派生类的成员函数可以访问派生类对象中基类的public和protected成员。
(3)用作基类的类必须是已定义的,之声明的不行。
(4)若只是声明一个派生类时,不要后面的派生列表。
virtual和其他成员函数
(1)动态绑定:首先需要是虚函数,其次需要是指针或引用来调用。
(2)静态类型:指针或引用在编译时已知的类型,动态类型:所绑定的对象的类型,在运行时才知道。
(3)基类类型的指针或引用可以指向派生类对象,,无论实际对象是哪种,编译器都将它看做基类对象
,这样是安全的,因为派生类对象包含了基类的部分
(4)可以使用域作用符来覆盖掉虚函数机制(调用虚函数时想不使用虚函数的动态绑定)
(5)非虚函数的调用在编译时就确定是基类对象还是派生类对象的调用,使用基类型指针时一定是基类
型对象的调用。
(6)通过基类类型的指针调用虚函数时,默认实参为基类中声明的那个,而用派生类指针时为派生类中声明的
那个,这样在基类中的虚函数的默认实参与派生类中的默认实参不一致时很容易出问题。
public,private,protected的继承:
(1)每个类控制他所定义的成员的访问,派生类可以进一步的限制但不能放松基类的成员的访问。
(2)派生类不能访问基类的private成员,可以访问基类的public和protected成员。
(3)若是基类的public和protected成员,则由派生列表中访问标号来决定访问权限,
若是public继承:基类的public派生类还是public访问,基类的protected成员派生类还是protected访问。
若是protected继承:基类的public和protected成员,在派生类为protected成员。
若是private继承:基类所有成员在派生类中为private成员(这样对基类的成员就没有访问权限)。
(4)class保留字的默认继承是private,而struct的默认继承是public
(5)private继承是非常罕见的(相当于派生类对基类的所有成员都没有访问权限)。
(6)派生类中可以恢复继承成员的访问级别,但不能使其严格或宽松。
友元关系与继承:
(1)友元可以访问类的private和片protected成员
(2)派生类可以什么其他函数或类为自己的友元
(3)友元关系不能继承,所以基类的友元对于派生类没哟特殊的访问权限。
static成员与继承:
(1)每个static成员只有一个实例,在整个继承体系中。
(2)static成员遵循常规的访问控制,如果static成员在基类中为private成员,则派生类不能访问它。
(3)假设可以访问static成员,则既可以通过基类访问,也可以通过派生类访问。既可以用域操作符
也可以用·或->的成员访问操作符。