【问题标题】:Turning a non-pure virtual function into pure in a subclass在子类中将非纯虚函数变为纯虚函数
【发布时间】:2013-05-16 10:30:02
【问题描述】:

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

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 中存在一个非纯虚函数,但只有 {} 是空的;也就是说,它是空的,只有在迭代遇到ClassC 时才可用,在这种情况下它会被调用,否则它什么也不做。我不能让它是纯的,否则我不能拥有ClassA 的对象。

但为了确保ClassC 确实实现了该功能,迫使该类的用户这样做,我在ClassB 中将此功能设为纯虚拟。

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

【问题讨论】:

    标签: c++ polymorphism virtual


    【解决方案1】:

    如果按照您在说明中介绍的方式实施,那就没问题了。在不涉及抽象基类和虚函数的整个部分的情况下,标准规定:

    C++ § 10.4p2

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

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

    C++11 § 10.4p5

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

    【讨论】:

    • 这个功能只有 C++11 才有?这很有趣。
    • @Fellowshee 这是我得心应手的标准,如果说它适用于所有基于标准的 C++,除非我拥有所有这些标准,否则我感觉不正确指尖。不过,我认为它可能一直受到支持。
    【解决方案2】:

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

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

    但要确保ClassC 确实实现了该功能, 强迫该类的用户这样做,我使这个函数纯 virtualClassB

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

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

    【讨论】:

    • 我已经用正确的术语更新了我的问题。我的意思不是“未实施”,我的意思是“空实施”
    • @Fellowshee,剩下的部分应该回答你的问题。你也可以参考this thread,我在这里讨论类似的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2016-07-16
    • 2016-02-18
    • 1970-01-01
    • 2021-08-08
    • 2021-09-30
    相关资源
    最近更新 更多