定义虚函数的目的
:为了允许用基类的指针来调用子类的这个函数。定义纯虚函数的目的
:为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
注意:
C++ 中,基类必须指出希望派生类重写哪些函数,定义为 virtual 的函数(虚函数)是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。
虚函数定义
:被virtual关键字修饰的成员函数。
使用规则:
虚函数符号子类可以不加virtual
:c++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此,在子类从新声明该虚函数时,可以加,也可以不加,但习惯上每一层声明函数时都加virtual,使程序更加清晰。作用:
注意:
非虚函数
总是在编译时根据调用该函数的对象、引用或指针的类型而确定。在 C++ 中,基类必须指出希望派生类重写哪些函数,定义为 virtual 的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。//也就是说虚函数部分,是不被作为基类部分在派生类中继承的,而是被重新定义的,画一画继承的图可能会更清晰地理解这一点。
纯虚函数(pure virtual)没有实现,被初始化为0;规定:在函数形参表后面写上 = 0 以指定纯虚函数。
1 | virtual void fun(void) = 0; |
声明一个纯虚函数(pure virtual)的目的:
声明非纯虚函数(impure virtual)的目的:
一般成员函数,无virtual关键字修饰。非虚函数
总是在编译时根据调用该函数的对象、引用或指针的类型而确定,而不是像
C++11新标准允许派生类显式注明它使用某个成员函数覆盖了它继承的虚函数,具体做法是在形参列表或const限定符或引用限定符后面添加一个关键字override
。
规定:
优点:
1 | class A |
在C++11中允许将类标记为final,方法时直接在类名称后面使用关键字final。如果继承该类会导致编译错误。
1 | class A final |
在C++中,如果把某个函数指定为final
,使之后任何尝试覆盖该函数的操作都引发错误。final关键字至于方法参数列表后面。
1 | class A |
抽象类
:包含有(或继承)一个或多个纯虚函数的类是抽象类。在C#,Java中用abstract定义抽象类,而在C++中有抽象类的概念,但没有这个关键字。
规定:
特点:
C++接口满足以下条件:
实现继承:派生类同时继承基类的接口和实现。
接口继承:派生类不继承基类的实现,只会继承基类的接口。
如果类中包含有纯虚函数,则这个类是抽象类,而且由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。
如果有虚函数和正常函数就是普通的类。
纯虚函数
:要求继承类必须含有某个接口,并对接口函数实现。虚函数
:继承类必须含有某个接口,可以自己实现。也可以不实现,而采用基类定义的缺省实现。非虚函数
:继承类必须含有某个接口,必须使用基类的实现。
C++ primer 第四版
C++接口继承与实现继承
C++虚函数
C++开发者眼中的Java关键字abstract
任何可以在基类对象上执行的操作也可以通过派生类对象使用。
可以使用基类类型的指针或引用来引用派生类型对象,所以,使用基类类型的引用或指针时,不知道指针或引用所绑定的对象的类型:基类类型的引用或指针可以引用基类类型对象,也可以引用派生类型对象。无论实际对象具有哪种类型,编译器都将它当作基类类型对象。将派生类对象当作基类对象是安全的,因为每个派生类对象都拥有基类子对象。而且,派生类继承基类的操作。
Update your browser to view this website correctly. Update my browser now