C++中的抽象类、虚函数和纯虚函数 c++
abstrct class:在C++中,含有纯虚函数的类为抽象类,不能生成对象;同理JAVA中,抽象类对于提供模式、蓝图和后代遵循的原则有用。 编程
纯虚函数和虚函数的区别在于前者不包含定义,后者包含函数体。 函数
虚函数:在某基类中声明为virtual并在一个或多个派生类中被从新定义的成员函数。 spa
用途:实现多态(动态绑定),经过指向派生类的基类指针访问派生类中同名覆盖成员函数。 设计
若是父类的函数(方法)根本没有必要或者没法实现,彻底要依赖子类去实现的话,能够把此函数(方法)设为virtual 函数名=0 咱们把这样的函数(方法)称为纯虚函数。 指针
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程当中避免犯错误,须要理解四个名词:
一、对象的静态类型:对象在声明时采用的类型。是在编译期肯定的。
二、对象的动态类型:目前所指对象的类型。是在运行期决定的。 code
对象的动态类型能够更改,可是静态类型没法更改。关于对象的静态类型和动态类型,看一个示例: htm
class B { } class C : public B { } class D : public B { } D* pD = new D();//pD的静态类型是它声明的类型D*,动态类型也是D* B* pB = pD;//pB的静态类型是它声明的类型B*,动态类型是pB所指向的对象pD的类型D* C* pC = new C(); pB = pC;//pB的动态类型是能够更改的,如今它的动态类型是C*
三、静态绑定:绑定的是对象的静态类型,某特性(好比函数)依赖于对象的静态类型,发生在编译期。 对象
四、动态绑定:绑定的是对象的动态类型,某特性(好比函数)依赖于对象的动态类型,发生在运行期。 继承
class B { void DoSomething(); virtual void vfun(); } class C : public B { void DoSomething();//首先说明一下,这个子类从新定义了父类的no-virtual函数,这是一个很差的设计,会致使名称遮掩;这里只是为了说明动态绑定和静态绑定才这样使用。 virtual void vfun(); } class D : public B { void DoSomething(); virtual void vfun(); } D* pD = new D(); B* pB = pD;让咱们看一下,pD->DoSomething()和pB->DoSomething()调用的是同一个函数吗?
class B { virtual void vfun(int i = 10); } class D : public B { virtual void vfun(int i = 20); } D* pD = new D(); B* pB = pD; pD->vfun(); pB->vfun();有上面的分析可知pD->vfun()和pB->vfun()调用都是函数D::vfun(),可是他们的缺省参数是多少?