结论1:接口继承和实现继承不同。在public继承之下,derived classes总是继承base classes的接口。
public继承由两部分组成:函数接口继承和函数实现继承。
结论2:pure virtual函数只具体指定接口继承。
pure virtual函数有两个最突出的特性:它们必须被任何继承了它们的具体class重新声明,而且它们在抽象class中通常没有定义。声明一个pure virtual函数而没有定义目的是为了让derived只继承函数接口。
结论3:简朴的(非纯)impure virtual函数具体指定接口继承和缺省实现继承。
impure virtual具体指定的缺省实现在derived class未明确说出“我要”的情况下就已经被继承了。为了实现“提供缺省实现给derived classes,但需要derived classes明确要求”,需要切断“virtual函数接口"和其”缺省实现“之间的连接。例如:
class Airplane {
public:
virtual void fly(const Airport& destination) = 0;
...
protected:
void defaultFly(const Airport& destination);
};
void Airplane::defaultFly(const Airport& destination)
{
缺省行为,将飞机飞至指定目的地。
}
class ModelA:public Airplane {
public:
virtual void fly(const Airport& destination)
{defaultFly(destination);}
...
};
此外,还可以利用”pure virtual函数必须在derived class中重新声明,但也可以拥有自己的实现,调用时需要明确指出其class名称“这一事实,实现“提供缺省实现给derived classes,但需要derived classes明确要求”,例如:
class Airplane {
public:
virtual void fly(const Airport& destination) = 0;
...
protected:
void defaultFly(const Airport& destination);
};
void Airplane::fly(const Airport& destination)
{
缺省行为,将飞机飞至指定目的地。
}
class ModelA:public Airplane {
public:
virtual void fly(const Airport& destination)
{Airplane::fly(destination);}
...
};
这样做合并了fly 和 defaultFly,丧失了“让两个函数享有不同保护级别"的机会。
结论4:non-virtual函数具体指定接口继承以及强制性实现继承。