6

所以,我有这个多态层次结构:

ClassA
Is not abstract, no pure virtual functions, but a few virtual functions

ClassB:public ClassA
Defines an extended interface for a certain type of subclass; 
 is abstract with pure virtual functions

ClassC:public ClassB
Usable class, no more subclassing

这是交易,我将把对象放在一起放入容器中ClassAClassC进行迭代。为了执行这个迭代,一个非纯虚函数存在于ClassA但为空的只有{}; 也就是说,它是空的,只有在迭代遇到 a 时才可用,ClassC在这种情况下它被调用,否则它什么也不做。我不能让它是纯的,否则我不能拥有ClassA.

但是为了确保它ClassC确实实现了该功能,迫使该类的用户这样做,我在ClassB.

这可以接受吗?如果我采用非纯虚函数,使其成为纯虚函数,然后再次使其成为非纯虚函数,什么都不会“破坏” ClassC

4

2 回答 2

5

如果按照您在解释中介绍的方式实施,那就没问题了。在不深入讨论抽象基类和虚函数的情况下,该标准规定:

C++ § 10.4p2

抽象类是只能用作其他类的基类的类;抽象类的任何对象都不能被创建,除非是从它派生的类的子对象。如果一个类至少有一个纯虚函数,那么它就是抽象的。[注意:这样的功能可能会被继承:见下文。— end note ] 一个虚函数是通过在类定义的函数声明中使用纯说明符(9.2)来指定的。纯虚函数仅在使用或如同使用 (12.4)、qualified-id 语法 (5.1) 调用时才需要定义

上面引用的“下面”导致了这个注释:

C++11 § 10.4p5

[注意:抽象类可以从非抽象类派生,纯虚函数可以覆盖非纯虚函数。-结束注]

于 2013-05-16T11:02:02.347 回答
0

非纯虚函数存在ClassA但未实现;

这会导致链接器错误。在创建对象ClassA或其子类时,virtual必须实现所有方法。仅对于纯virtual方法,方法的主体是可选的。

但为了确保它ClassC确实实现了该功能,迫使该类的用户这样做,我将这个函数设为 纯virtual.ClassB

是的,这种方式是正确的。但是,您还应该评估一下,是否值得拥有一个新类以确保实现的方法很少?
对于 C++11,您也可以考虑巧妙地使用override标识符。

此外,您不必担心 的内部细节vtable,因为它们是实现定义的。

于 2013-05-16T11:04:50.927 回答