c++:多态性+多重继承顺序.继承顺序是否重要
c++: polymorphism + multiple inheritance order. Is the inheritace order significant?
我正试图解决与以下代码类似的一个小谜团:
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:在第一个备选方案(删除对象)中,如果要删除的对象的静态类型与其动态类型不同,静态类型应为要删除的对象,静态类型应具有虚拟析构函数或行为未定义。
相关文章:
- CPP 继承虚拟方法解析顺序
- 继承和例外中的C'tor/D'tors的顺序
- 关于构造商的呼叫和继承顺序的混乱
- 在继承中更改构造函数的顺序
- 在虚拟继承中构造函数调用的顺序是什么
- 为什么异常捕获是基于顺序的,而不是基于最接近继承的
- c++:多态性+多重继承顺序.继承顺序是否重要
- C++继承和初始化顺序
- 为什么继承顺序或映射会影响 vftable 的下标?(对于 VSC 表示C++)
- 继承顺序C++以何种方式影响构造函数
- 使用继承时构造函数/析构函数调用的顺序
- c++多继承顺序和虚函数
- 改变继承顺序会产生不同的结果
- 多重继承时的执行顺序
- c++中的继承:构造顺序
- 继承层次结构:构造函数和析构函数执行顺序
- 类和接口之间的继承顺序重要吗?
- 函数解析中使用的多重继承顺序
- 在继承中调用构造函数的顺序
- 虚拟继承构造函数顺序