我有一个带有几个纯虚函数的抽象类,我从它派生的一个类不使用纯虚函数之一:
class derivative: public base
{
public:
int somevariable;
void somefunction();
};
无论如何,当我尝试编译它时,我得到一个错误(显然,如果从抽象类派生并且不覆盖所有纯虚函数,则仍然认为类是抽象的)。无论如何,定义一个函数
似乎毫无意义int purevirtfunc(){return 0;}
只是因为它需要通过技术性来定义。无论如何从抽象类派生一个类而不使用抽象类的纯虚函数之一?
答案 0 :(得分:40)
如果派生类没有“使用”基类纯虚函数,那么派生类不应该从基类派生,或者PVF不应该在那里。无论哪种情况,您的设计都有问题,需要重新考虑。
不,没有办法删除PVF。
答案 1 :(得分:14)
纯虚拟类是一个接口,您的代码可以满足该接口。如果您实现了该接口并且没有实现其中一个方法会发生什么?调用您的界面的代码如何知道您没有实现该方法?
您的选择是:
答案 2 :(得分:9)
从抽象类派生的目的是外部代码可以使用抽象类并期望所有函数都已正确实现。能够实现一种方法会破坏这个目的,使代码无法编译。但是,如果您愿意,可以自由地抛出异常。
答案 3 :(得分:5)
这根本不是技术性问题。如果派生类没有展示父项的所有行为,则不应从父项派生它。这是一个主要的设计气味,你可能需要一些设计重构。
答案 4 :(得分:1)
当您从具有纯虚函数的类继承时,您必须实现这些函数。如果不这样做,那么派生类也是抽象的,你不能创建派生类的对象。
答案 5 :(得分:1)
没有。如您所建议的那样,在基类中提供默认实现,或在派生类中提供简单实现。
答案 6 :(得分:1)
已经有了很好的答案,但如果您想从理论OO设计方面获得更多信息,请查看Liskov substitution principle。
答案 7 :(得分:0)
允许这没有任何意义。如果你在没有实现的情况下调用函数会发生什么?运行时错误(这会很愚蠢)?您可能会认为在某些情况下可能会出现编译时错误,但如果确切类型未知(例如,您将指向派生类实例的指针传递给函数),则无法实现这一点。
答案 8 :(得分:0)
正如很多人已经说过的那样,听起来要么基本方法不应该是纯虚拟的,要么你应该重新考虑你的派生类是否真的是ISA基础。
但是,可以在基类中提供纯虚方法的实现。这可以像派生类的默认实现一样,但是仍然需要派生类来选择基类的实现明确性。
我不知道这是否能帮助您解决问题。