我有下面的类层次结构:段错误调用函数
ICSL::ISystemModel
ICSL::ISystemModelAffine : public ISystemModel
ICSL::Quadrotor::SystemModelQuadrotor : public QObject, ISystemModelAffine
ICSL::Quadrotor::SystemModelQuadrotorSimulated : public public SystemModelQuadrotor
然后,在另一个类我定义
SystemModelQuadrotor mDynamicModelReal;
SystemModelQuadrotorSimulated mDynamicModelSimulated;
在初始化我打电话了一堆的函数来设置两个变量mDynamicModelReal
和mDynamicModelSimulated
没有问题。稍后,我从ISystemModel
调用一些函数来访问一些变量,它们适用于mDynamicModelReal
,但段错误为mDynamicModelSimulated
。在gdb中检查,变量值是正确的,它似乎知道函数是什么,但它试图调用实际函数(基于我对这些东西的有限理解)抱怨。下面是GDB探测它segfaulted用于调用mDynamicModelSimulated.getName()
(gdb) print mDynamicModelSimulated.mName
$19 = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x810658 "quadGaui5"}}
(gdb) print mDynamicModelSimulated.getName
$20 = {const std::string (ICSL::ISystemModel * const)} 0x44f506 <ICSL::ISystemModel::getName()>
(gdb) print mDynamicModelSimulated.getName()
Cannot access memory at address 0x4082c00000000030
后,这里是的getName()的
Class ISystemModel {
public:
...
virtual std::string const getName(){return mName;};
...
protected:
...
std::string mName;
...
};
我不明白为什么它不能使该函数调用的定义。我确实发现,如果从函数定义中删除“virtual
”,它不会出现段错误,但我不明白为什么会有所作为。我应该在哪里寻找问题的根源?
你如何在父类中设置变量mName? – Izza
您是否也在其他派生类中定义了'getName()'? – iammilind
ISystemModel和ISystemModelAffine不会设置mName,而其他两个类只是在其构造函数中明确设置它(例如mName =“”;) getName()没有在其他地方定义(对于这些类) – ryan0270