【问题标题】:Require override of parent virtual function需要覆盖父虚函数
【发布时间】:2013-03-01 22:09:15
【问题描述】:

我正在开发一个序列化系统,我所有的可序列化类都实现了

virtual void serialize(Buffer buffer);

当一个指针要被序列化时,我需要调用类本身的 serialize() 函数,而不是它的任何父类的函数,即使指针是父类型,并且我一直在运行进入很多错误,因为我没有注意到子类甚至根本没有 serialize() 所以父类 serialize() 只是被调用

class A
{
    virtual void serialize();
}

class B:public A
{
    virtual void serialize();
}

class C:public B
{
    virtual void serialize();
}

void doSerialization(A *a)
{
    a->serialize();
}


C *c=new C();
doSerialization(c);

现在,如果 C 没有序列化函数,则 B::serialize() 将被静默调用。我更喜欢一条错误消息,或者任何其他至少会向我指出的东西。 C++(甚至是'11)中是否有任何关键字可以做到这一点?

【问题讨论】:

    标签: c++


    【解决方案1】:

    在 C++ 中没有简单的方法。

    一个技巧,在 this answer 中解释,使用虚拟继承并强制你的类注册他们正在使用的 serialize 方法。

    【讨论】:

      【解决方案2】:

      在父级中使用纯虚函数:

      virtual void serialize(Buffer buffer) = 0;
      

      【讨论】:

        【解决方案3】:

        在编译时,您只能通过在非最终类中将函数设为纯虚函数来做到这一点:

        class A
        {
            virtual void serialize() = 0;
        }
        
        class B:public A
        {
            virtual void serialize() = 0;
        }
        
        class C final:public B
        {
            virtual void serialize();
        }
        

        当然,这意味着您设计中的所有具体类都必须是final。如果必须从具体类继承,则不能在编译时强制执行。

        【讨论】:

          【解决方案4】:

          现在,如果 C 没有序列化函数 B::serialize() 将被静默调用。

          不,您会收到链接器错误。如我所见,这就是你想要的。

          【讨论】:

          • 我认为他的意思是如果 C 没有声明一个,那么 B 将被调用。无论如何,这使得他的陈述是有道理的。
          【解决方案5】:

          解决此问题的一个变体是不继承多个层,因此您使用class C: public A 代替class C: public B。当然,这不一定适用于所有场景。

          迟早有一天,你必须把事情交给程序员。

          也可能有一些方法可以检查这一点, - 可能创建一个指向 B 的临时指针并检查是否是 typeid(*this) == typeid(temp) 或类似的?

          【讨论】:

            猜你喜欢
            • 2013-10-04
            • 1970-01-01
            • 2012-02-24
            • 2021-09-30
            • 2015-06-17
            • 2015-12-15
            • 2011-11-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多