面向对象编程(Object-oriented programming, OOP)

//仅用于记录
C++基于三个基本概念:数据抽象继承动态绑定
数据抽象:用进行数据抽象。
继承:用派生从一个类继承另一个类:派生类继承基类的成员。
动态绑定:使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数

注:继承和动态绑定容易地定义与其他类相似(similar)但又不相同(different)的新类,能够容易地编写忽略这些相似类型之间区别的程序。

面向对象编程的关键思想是:多态性(polymorphism)。i.e. 许多形态,通过继承而相关联的类型成为多态类型,可以互换地使用派生类型或基类型的“许多形态”。C++中多态性仅用于通过继承而相关联的类型的引用或指针

1.继承
派生类(derived class)能够继承基类base class定义的成员。
基类必须指出希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数
2.动态绑定
动态绑定dynamic binding:能够通过编写程序使用继承层次中任意类型的对象,无需关心对象的具体类型。使用这些类的程序无需区分函数是在基类还是在派生类中定义的。

//calculate and print price for given number of choices, applying any discounts
void print_total(ostream &os, const Item_base &item, size_t n)
{
      
		os <<"ISBN:" << item.book()		//calls Item_base::book
			<<"\tnumber sold: "  << n <<"\ttotal price:"
			//virtual call:which version of net_price to call is resolved at run time
			<<item.net_price(n) <<endl;
}

解释:上述函数调用形参Item_base的两个函数book和net_price,打印结果。注意:引用形参Item_base时,可以将对象Item_base或Bulk_item对象传给他;虚函数net_price形参引用时,对net_price的调用将在运行时**确定,调用哪个版本的net_price将依赖于传给print_total的实参。例如:实参为Buck_item对象,将运行Bulk_item中定义的应用折扣的net_price;实参为Item_base对象,则调用Item_base定以的net_price;

总结:动态绑定发生在通过基类的引用(或指针)调用虚函数时。引用(或指针)即可指向基类对象也可以指向派生类对象
用引用(或指针)调用虚函数在运行时确定,被调用的函数是引用所指对象的实际类型所定义的。

你可能感兴趣的:(C++)