c++:多态性+多重继承顺序.继承顺序是否重要

c++: polymorphism + multiple inheritance order. Is the inheritace order significant?

本文关键字:顺序 继承 是否 多重继承 多态性 c++      更新时间:2023-10-16

我正试图解决与以下代码类似的一个小谜团:

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上发生了с0000005 0a9e应用程序崩溃,因为它做了g ()中列出的事情,部分打印了"HI!"
因此,在某个时刻,它停止打印到文件中,完成其他所有操作,最后崩溃。某个点意味着一个真正的某个点:例如,file << "phrase"可能产生phra,之后什么都没有
此外,它执行正确,在GDB中执行时不会崩溃。memory博士表示,没有内存泄漏。

解决方案:

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

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

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

像这样它应该工作:

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

在线演示

标准参考:

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