第15章 面向对象编程(2)
15.2.2 protected成员
可以认为protected访问标号是private和public的混合:
像private成员一样,protected成员不能被类的用户访问。
像public成员一样,protected成员可被该类的派生类访问.
派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。
提供给派生类型的接口是protected成员和public成员的组合。
15.2.3 派生类
为了定义派生类,使用类派生列表(class derivation list)指定基类。类派生列表指定了一个或多个基类。
只需要了解访问标号决定了对继承成员的访问权限。如果想要继承基类的接口,则应该进行public派生。
派生类继承基类的成员并且可以定义自己的附加成员。每个派生类对象包含两个部分:从基类继承的成员和自己定义的成员。一般而言,派生类只(重)定义那些与基类不同或扩展基类行为的方面。
1. 定义派生类
class Bulk_item:public Item_base{
public:
double net_price(size_t) const;
private:
size_t min_qty;
double discount;
};
2. 派生类和虚函数
尽管不是必须这样做,派生类一般会重定义所继承的虚函数。如果派生类没有重定义某个虚函数,则使用基类中定义的版本。
派生类型必须对象要重定义的每个继承成员进行声明。
派生类中虚函数的声明必须与基类中的定义方式完全匹配,但有一个例外:返回对基类型的引用(或指针)的虚函数。派生类中的虚函数可以返回基类函数所返回类型的派生类型的引用(或指针)。
一旦函数在基类中声明为虚函数,它就一直为虚函数,派生类无法改变该函数为虚函数这一事实。派生类重定义虚函数时,可以使用virtual保留字,担不是必须这样做。
3. 派生类对象包含基类对象作为子对象
派生类对象由多个部分组成:派生类本身定义的(非static)成员加上由基类(非static)成员组成的子对象。
C++语言不要求编译器将对象的基类部分和派生部分连续排列。
4. 派生类中的函数可以使用基类的成员
像任意成员函数一样,派生类函数可以在类的内部或外部定义。
double Bulk_item::net_price(size_t cnt) const
{
if(cnt>=min_qty)
return cnt*(1-discount)*price;
else
return cnt*price;
}
因为每个派生类对象都有基类部分,类可以访问其基类的public和protected成员,就好像那些成员是派生类自己的成员一样。
5. 用作基类的类必须是已定义的
每个派生类包含并且可以访问其基类的成员,为了使用这些成员,派生类必须知道它们是什么。这一规则暗示着不可能从类自身派生出一个类。
6. 用派生类做基类
基类本身可以是一个派生类。
最底层的派生类对象包含其每个直接基类和间接基类的子对象。
7. 派生类的声明
如果需要声明一个派生类,则声明包含类名但不包含派生列表。
摘自 xufei96的专栏
补充:软件开发 , C++ ,