gpt4 book ai didi

c++:多态性+多重继承顺序。继承顺序重要吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:57:49 24 4
gpt4 key购买 nike

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

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;
}

它有效,但随机退出导致 с0000005 0a9e appcrash 在 Windows 上完成了 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() {};
};

Online demo

标准引用:

5.3.5/3: In the first alternative (delete object), if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined.

关于c++:多态性+多重继承顺序。继承顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36680781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com