面向对象编程基于三个基本概念:数据抽象、继承和 动态绑定;
在c++中,用类进行数据抽象; 用类派生从一个类继承另一个类:派生类继承基类的成员;
多态:动态绑定使编译器能够在 运行时 决定是使用基类中定义的函数还是派生类中定义的函数;
面向对象编程的关键思想是多态性(polymorphism);实现多态必须通过:1、继承 2、动态绑定
通过动态绑定(dynamic binding)能够编写程序使用继承层次中任意类型的对象,无须关心对象的具体类型。使用这些类的程序
无须区分函数是在基类还是在派生类中定义的;
在c++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行是确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的;
1 void print(const base &item, size_t n) 2 { 3 os << item.net_price(n) <<endl; 4 } 5 /* 6 *base base1; 7 *diver diver1; //diver继承base; 8 * 9 * net_price(size_t t)在base为virtual函数,并有实现(非纯虚函数) 10 * net_price(size_t t)在diver内也进行了函数实现 11 * 12 *在print中调用基类中net_price()还是派生类中的net_price()呢? 13 * 这个是由程序在运行时决定的,关键在于看参数base&的引用 14 * 是指向基类对象呢,还是指向派生类对象呢,来直接确定的; 15 *(实现的基础是:基类的引用即可以指向基类对象也可以指向派生类对象) 16 */
1 class Item_base{ 2 public: 3 Item_base(const std::string &book="", 4 double sales_price=0.0): 5 isbn(book), price(sales_price) 6 { 7 } 8 9 std::string book() const 10 { 11 return isbn; 12 } 13 virtual double net_price(std::size_t n) const 14 { 15 return n*price; 16 } 17 virtual ~Item_base() 18 { 19 } 20 private: 21 private: 22 std::string isbn; 23 protected: 24 std::string isbn; 25 protected: 26 } 27 private: 28 std::string isbn; 29 protected: 30 double price; 31 } 32 /*除了构造函数之外,(析构函数最好加virtual)任意非static成员函数都可以是虚函数。 33 *保留字只能在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上; 34 */
原文:http://www.cnblogs.com/chris-cp/p/4376583.html