virtual可以在除了构造函数,任意非static成员函数都可以成为虚函数,virtual的目的是启用动态邦定,成员默认为非虚函数。。virtual只在类内部成员函数声明中出现,不能在类定义体外部出现的函数定义上。
派生类一般会重定义所继承的虚函数,如果没有重定义,则使用基类中定义的版本。派生类中的虚函数可以返回基类函数所返回类型的引用或指针。
用作基类的类必须是已定义的:
class Item_base; //declared bu not define
class Bulk_item:public Item_base{...} //error:Item_base must be defined
C++中的函数调用默认不使用动态绑定,要触发动态绑定,必须满足两个条件:
1.只有指定为虚函数的成员函数的成员函数才能进行动态绑定
2.必须通过基类类型的引用或指针进行函数调用
//function with an Item_base reference parmeter
double print_total(const Item_base &,size_t);
Item_base item; //object of base type
Item_base *p=&Item;
可以使用基类类型的指针或引用派生类对象,无论对象是那类型,编译器都将它作为基类
Item_base base;
Bulk_item derived;
print_total(count ,base ,10); //calls Itme_base::net_price
print_total(count,derived,10);//calls Bull_item::net_price
基类类型的引用或指针绑定到派生类对象后,对象本身不会改变,仍为派生类对象
可以通过使用作用于操作符覆盖虚函数机制
Item_base (basep=&derived;
double d=basep->Item_base::net_price(42); //calls version from the base calss
在函数形参表后面写上“=0”已指定纯虚函数
class Dis_item:public Item_base
{
public:
double net_price(size_t) const =0;
};
将函数定义为纯虚函数说明该函数为后代类型提供了可以覆盖的接口,但是这个类中的版本决不会调用,除了作为抽象基类的派生类的对象的组成部分不能创建抽象基类的对象
Dis_item discount; //eeror
Bulk_item bulk;