C++ c++;:多态性+;多重继承顺序。继承顺序是否重要?

C++ c++;:多态性+;多重继承顺序。继承顺序是否重要?,c++,polymorphism,multiple-inheritance,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 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;
}
问题:为什么

我想这与类中的相对字段位置有关,但是GDB中没有崩溃,也没有内存问题的迹象呢?

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

像这样,它应该可以工作:

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

标准参考:

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


“我正试图解决一个关于代码的小谜团,类似于下面的“不要发布不会表现出问题行为的代码”。做出一个决定。从您发布的代码判断,您忘记将析构函数设置为虚拟。@Revolver\u Ocelot问题完全可以重现。我系统地得到一个运行时错误:它是
SomeClass
Interface
缺少一个虚拟析构函数。@Revolver\u Ocelot是的,我忘记了析构函数。但是它们在
main()
结束之前不会被调用,因此它们不应该破坏
ostringstream
流的
中断打印“它们不应该破坏”它是UB。任何事情都有可能发生。编译器只是重新排序了一些在销毁后发生的事情。它可以做到这一点,若它并没有改变格式良好的程序的可见行为,那个么当
接口
位于继承列表的第一位,并且支持缺少虚拟析构函数的原因时,一切似乎都正常工作。
struct Interface {
    virtual void f () = 0;
    virtual ~Interface() {};
};