面向对象的三个基本概念:封装 继承 多态
一 定义基类和派生类
1 定义基类
virtual修饰的函数为虚函数,对虚函数的调用在程序运行时确定
成员函数默认是非虚函数,对非虚函数的调用在编译时确定
除了构造函数以外,任意非static成员函数都可以使虚函数,virtual只在类内部的成员函数声明中出现,不能在类定义体外部出现
在函数定义上。
2 访问控制与继承
用户代码可以访问类的public成员而不能访问类的private成员,private成员只能由基类的成员和友元访问。
protected成员可以被派生类对象访问但不能被该类型的普通成员访问。
3 派生类只能通过派生类对象访问基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。
protected price;//定义于基类
void Bulk_item::memfcn(const Bulk_item &d,const Item_base &b)
{
double ret=price;//OK this->price
ret=d.price;//OK 派生类对象
ret=b.price;//error 基类对象
}
4 派生类
class classname:access-label base-class
access-label:public private protected
访问标号决定了对继承成员的访问权限,如果想要继承基类的接口,则应该使用public派生
派生类会重新定义所继承的虚函数,如果派生类没有重定义某个虚函数,则使用基类中的版本。
派生类中虚函数的声明必须与基类中的定义方式完全匹配,但是有一个例外:返回对及类型的引用(或指针)的虚函数,派生类中
的虚函数可以返回基类函数所返回类型的派生类型引用(或)指针。
5 用作基类的类必须是已经定义的
6 virtual与其他成员函数
要触发动态绑定需要满足如下两个条件:
1)只有指定为虚函数的成员函数才能进行动态绑定
2)必须通过基类类型的引用或指针进行函数调用
7 引用和指针的静态类型与动态类型可以不同,这是C++可以支持多态性的基础。
静态类型:在编译时可知的引用类型或指针类型
动态类型:指针或引用所绑定的对象的类型,这是仅在运行时可知的
8 对非virtual成员的调用在编译时确定为调用基类的成员。
非虚函数总是在编译时根据调用该函数的对象、引用或指针的类型而确定。
9
posted on
浙公网安备 33010602011771号