第15章 面向对象编程(1)
面向对象编程基于三个基本概念:数据抽象、继承和动态绑定。在C++中,用类进行数据抽象,用类派生从一个类继承另一个类:派生类继承基类的成员。动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数。
面向对象编程(Object-oriented programming, OOP)
15.1 面向对象编程:概述
1.继承
派生类(derived class)能够继承基类(base class)定义的成员,派生类可以无须改变而使用那些与派生类型具体特征不相关的操作,派生类可以重定义那些与派生类型相关的成员函数,将函数特化,考虑派生类型的特征。最后,除了从基类继承的成员之外,派生类还可以定义更多的成员。
因继承而相关联的类为构成了一个继承层次(inheritance hierarchy)。其中有一个类称为根,所有其他类直接或间接继承根类。
在C++中,基类必须指出希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。
2.动态绑定
在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。
15.2 定义基类和派生类
15.2.1 定义基类
class Item_base
{
public:
Item_base(const string &book="",double sales_price=0.0):isbn(book),price(sales_price){}
string book() const {return isbn;}
virtual double net_price(size_t n) const
{
return n*price;
}
virtual ~Item_base(){}
private:
string isbn;
protected:
double price;
};
1. 基类成员函数
保留字virtual的目的是启动动态绑定。成员默认为非虚函数,对非虚函数的调用在编译时确定。为了证明函数为虚函数,在其返回类型前面加上保留字virtual。除了构造函数之外,任何非static成员函数都可以是虚函数。保留字virtual只在类内部的成员函数中出现,不能用在类定义体外部出现的函数定义上。
基数通常应将派生类需要重定义的任意函数定义为虚函数。
2. 访问控制和继承
public和private标号具有普通含义:用户代码可以访问类的public成员而不能访问private成员,private成员只能由基类的成员和友元访问。派生类对基类的public和private成员的访问权限与程序中任意其他部分一样:它可以访问public成员而不能访问private成员。
protected成员可以被派生类对象访问但不能被该类型的普通用户访问。
摘自 xufei96的专栏
补充:软件开发 , C++ ,