c ++:多态+多重继承顺序。遗产顺序是否重要?

时间:2016-04-17 18:52:05

标签: c++ polymorphism multiple-inheritance

我正在尝试解决类似以下代码的一些谜:

struct Interface {
    virtual void f () = 0;
}

struct SomeClass {
    virtual void additionalBehaviour () = 0;
    void g () {
        additionalBehavoiur ();
        /*Some stuff with printing into a ostringstream*/
    }
}

struct Derived : public SomeClass, public Interface {
    void additionalBehaviour () { /*Some printing to oss*/ }
    void f () { g (); }
}

int main () {
    unique_ptr<Interface> ifc (new Derived ());
    ifc->f ();
    cout << "HI!" << endl;
    return 0;
}

它可以正常工作,但是在Windows上随机退出导致с00000050a9e appcrash已完成g ()部分中列出的内容并且打印了“HI!”。
因此,在某些时候它会停止打印到文件中,完成其他所有操作,最后崩溃。有些观点意味着确实某些点:例如,file << "phrase"可能会产生phra,之后就不会产生任何内容。
此外,它正确执行,并且在GDB中执行时不会崩溃。根据记忆博士的说法,没有内存泄漏。

解决方案:

struct Derived : public Interface, public SomeClass {
    void f () { g (); }
}

问题:为什么?!
我想这是关于类中相对字段位置的问题,但是GDB中没有崩溃并且没有内存问题的迹象呢?

1 个答案:

答案 0 :(得分:4)

似乎问题与您没有虚拟析构函数有关。这就是为什么执行g()中的处理:当unique_ptr销毁对象时发生崩溃。

像这样它应该有效:

struct Interface {
    virtual void f () = 0;
    virtual ~Interface() {};
};

Online demo

标准参考:

  

5.3.5 / 3:在第一种方法(删除对象)中,如果要删除的对象的静态类型与其动态类型不同,   static类型应该是动态类型的基类   要删除的对象,静态类型应具有虚拟   析构函数或行为未定义。