当基类中含有虚函数(virtual)时,在运行时刻,通过基类指针(或引用)指向(或引用)具体派生对象时,当调用该指针(或引用)的虚函数时,实际调用的是该具体派生类中定义的相应函数。
那么如果存在以下继承关系:
class base;
class derived1:public base{...};
class derivedderived1:public derived1{...};
及derivedderived1继承自derived1,而derived1又继承自base,那么假设base中有一个虚函数
virtual void print(){...};
在derived1中也定义了该函数只是没有声明为virtual:
class derived:public base{
......
public:
void print(){...}
......
};
在derivedderived1中也定义了形式上一样的print函数,也没有加virtual说明符;这种情况下,当一个base指针指向derivedderived1的对象,并调用print函数时,会调用哪个类中的print呢?
答案是:derivedderived1中定义的print。这说明了在继承层次中只要从某一层定义时加了virtual的成员函数,其n重派生类中均可实现多态。
现在有另一个问题就是如果derivedderived1中没有定义print这时将调用哪个类的print呢?
答案是:将调用derived1中定义的print函数
评论