- 论坛徽章:
- 0
|
在派生类中重新定义基类的方法;
使用虚拟方法(virtual):如果没有使用关键字virtual ,程序将根据引用类型或指针类型选择方法;如果使用了,程序将根据引用或指针指向的对象的类型来选择方法。例如:
Brass dom("dominic banker", 1122,4235.5);
BrassPlus dot("dorothy", 1231,2231. ;
Brass & b1_ref = dom;
Brass & b2_ref = dot;
如果没有关键字virtual 如果使用关键字virtual
b1_ref.ViewAcct(); 使用Brass::ViewAcct() 使用Brass::ViewAcct()
b2_ref.ViewAcct(); 使用Brass::ViewAcct() 使用BrassPlus::ViewAcct()
也就是说,使用virtual的,主要看引用是引用的什么对象,而不用关键字的,是看引用本身是什么对象。
记住:要在派生类中重新定义基类的方法,通常应将基类方法声明为虚拟的。virtual只用于类声明的方法原型中。
使用虚拟虚构函数可以确保正确的析构函数序列被调用。
1 在基类方法的声明中使用关键字virtual可使该方法在基类以及所有的派生类(包括从派生类生出来的类)中是虚拟的;
2 若使用指向对象的引用或指针来调用虚拟方法,程序将使用为对象类型定义的方法,而不是用为引用或指针类型定义的方法。这称为动态联编或晚期联编。
3 若定义的类被用作基类,则应该将那些要在派生类中重新定义的类方法声明为虚拟的。
4 构造函数不能是虚拟函数。派生类不能继承基类的构造函数。
5 析构函数应当是虚拟函数,除非类不用做基类。
6 友元不能是虚拟函数,因为友元不是类成员,而只有成员才能是虚拟函数。
如果基类方法没有关键字virtual ,而派生类也没有重新定义此方法,那么派生类对象调用此方法。
如果基类方法使用关键字virtual ,而派生类重新定义此方法,但是没有用virtual ,派生类中将隐藏基类的方法。
如果基类方法使用关键字virtual ,而派生类用virtual 重新定义此方法,那么有派生类再派生出来的类可以重新定义此方法。
如果基类声明被重载了,则应在派生类中重新定义所有的基类版本。如果只重新定义一个,那么其他版本将被隐藏,在派生类中无法使用。
|
|