C++ Primer 5th笔记(chap 15 OOP)继承之派生类

1. 构造函数

每个类控制它自己的成员初始化过程:尽管派生类包含了从基类继承而来的成员,但是派生类不能直接初始化这些成员,而是需要使用基类的构造函数来初始化它们。

  • 派生类对象的基类部分与派生类对象自己的数据成员都是在构造函数的初始化阶段执行初始化操作
  • 首先会初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员
    eg.
Bulk_quote(const std::string& book,double p,std::size_t qty,double disc) : 
quote(book,p),min_qty(qty),discount(disc){
    
    }
  • 首先会初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员。

2. 静态成员

如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义,无论从基类中派生出来多少个派生类,对于每个静态成员来说都只存在唯一的实例。

2.1访问控制规则

静态成员遵循通用的访问控制规则。如果某个静态成员是可以访问的,那么既可以通过基类也可以通过派生类使用它。

3. 派生类的声明

派生类的声明包含类名但是不包含它的派生列表:

class Bulk_quote : public Quote;  // 错误,派生类列表不能出现在这里
class Bulk_quote;				  // 正确,声明派生类的正确方式

4. 被用作基类的类

如果想使用某个类作为基类,则该类必须是已经定义而非仅仅声明:主要是构造函数和成员变量必须定义,因为子类的构造函数必须使用父类的构造函数。

class Quote;		// 声明,但未定义
class Bulk_quote : public Quote {
    
    ...};	// 错误,Quote必须先被定义
  • 派生类中包含并且可以使用它从基类继承而来的成员,为了使用这些成员,派生类当然要先知道它们是什么,因此规定还有一层隐含的意思,即一个类不能派生它本身。
  • c++中类,是在实例化时才会查找相关代码,没有使用就不会生成对应代码,函数无论使用都会生成。类会自动生成一个namespace,其中的静态成员和静态变量,相当于namespace中的变量和函数。

5.防止继承的发生

如果想定义一个类并且不希望从它派生出新的类,可以禁止继承的方式,C++ 11 新标准中在类名后面紧跟一个关键字 final 即可实现:

class NoDerived final{
    
    /*...*/};  // NoDerived 不能作为基类

猜你喜欢

转载自blog.csdn.net/thefist11cc/article/details/114252063