标签:style class blog code java http
定义为 virtual的 函数是基类期待派生类(derived class)重定义的, 基类期待 派生类继承的函数不能定义为虚函数。
动态绑定:程序能 使用继承层次中任意类型的对象,无需关心对象的具体类型。 使用这些类的程序无须区分函数在基类还是在继承类中定义的。
尽管不是必须,派生类一般会重定义基类中的虚函数。如果没有重定义,则继承基类中定义的版本。派生类中虚函数的声明原型必须与基类中的定义方式完全匹配,但有一个例外:基类中返回值是对基类性的引用(或指针)的虚函数,在派生类中虚函数可以返回 基类和派生类 的引用(或指针)。
C++默认不适用动态绑定,要触发动态绑定,得满足2条件:1,只有指定为虚函数的成员函数才能进行动态绑定,2,必须通过基类类型的引用(或指针)才能进行函数调用。
可以使用基类类型的引用(或指针)来引用基类类型或派生类类型对象。基类类型引用和指针的关键点在于:静态类型(编译时可知的引用类型或指针类型)与动态类型(运行时才可知的,指针或引用绑定的对象类型)可能不同。
即动态绑定是由实参决定的。
1 class Cshape 2 { 3 public: 4 void SetColor(intcolor){m_nColor=color;} 5 virtual void Display(void){cout<<"Cshape"<<endl;} 6 private: 7 int m_nColor; 8 }; 9 10 class Crectangle:public Cshape{ 11 public: 12 virtual void Display(void) 13 { 14 cout<<"Crectangle"<<endl; 15 } 16 }; 17 18 class Ctriangle:public Cshape{ 19 virtual void Display(void) 20 {cout<<"Ctriangle"<<endl;} 21 }; 22 23 class Cellipse:public Cshape{ 24 public: 25 virtual void Display(void) 26 {cout<<"Cellipse"<<endl;} 27 }; 28 29 voidmain() 30 { 31 Cshape obShape; 32 Cellipse obEllipse; 33 Ctriangle obTriangle; 34 Crectangle obRectangle; 35 Cshape*pShape[4]={&obShape,&obEllipse,&obTriangle,&obRectangle}; 36 for(int i=0;i<4;i++) 37 pShape[i]->Display();//动态绑定 38 }
本程序运行结果:
虚基类与虚函数没有关系。用于多重继承,防止二义性产生。
虚函数 动态绑定 实现方式是:虚函数表,布布扣,bubuko.com
标签:style class blog code java http
原文地址:http://www.cnblogs.com/xaf-dfg/p/3781350.html