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() {};
};