2011-08-22 158 views
2

除继承之外,还有什么其他原因需要类具有虚拟功能?cpp继承问题

运行时发生什么情况,其中继承基类并且派生类没有实现少量的基类函数,而第三个类调用未定义的方法,这些未定义的方法被定义为基于虚拟的。 seg fault还是会调用基类函数?

如果我不想在我的派生类中的基类中定义所有的函数,但仍然有必要的继承,我该怎么办?

回答

3

除了继承之外,还有什么其他的原因需要类具有 作为虚函数?

如果您没有处理继承问题,则没有合理的用法来使用virtual函数。两者都是为了彼此。

其中一个基类继承和 派生类没有实现一些基类的功能和 第三类在运行时会发生什么调用它们在基础定义为虚拟 未定义的方法。 seg fault还是会调用基类函数?

如果派生类不做出关于virtual功能的任何声明在它的身上的话,那么(立即)基类virtual函数调用派生类对象。另一方面,如果你只是在派生类中声明virtual函数,但不定义它,那么这是一个链接器错误。没有分段错误。

,我应该怎么做,如果我不想定义我的派生类在我 基类中的所有功能,但仍然有到位的必要 继承?

虽然这是不明确的,我会说,你根本就没有申报/定义在派生类中virtual功能(你不想要的)。它将使用基类virtual函数。

+0

关于你回答的最后一个问题,如果它们只是内部执行的函数,那么使它们变为私有将阻止它们继承对吗? – Rhexis

+0

@Flyphe,no。访问说明符不能禁止被继承的函数(即覆盖)。你仍然可以覆盖它。如果函数被调用(在派生类对象中),那么它仍然可以解析为重写函数。 [见演示](http://www.ideone.com/3XmWL)。 – iammilind

+0

所以私有变量和函数可以继承?那么保护的意义是什么? – Rhexis

0

如果您没有重新实现virtual方法,调用者将调用基类。这是使用继承IMO的一点。

如果你不想要一个基类来实现虚拟方法,你可以像这样把它声明:

class Demo { 
    void foo() = 0; 
}; 

这就是所谓的抽象类。 请注意,您无法创建此类的实例。从Demo继承的任何类必须实现foo(),否则它也将是一个抽象类,并且因此不可实例化。