Если вы не очень хорошо разбираетесь в C ++, вы не должны вызывать виртуальные функции в конструкторе .Проблема заключается в том, что во время создания подобъекта тип объекта является базовым подобъектом, а не производным объектом, поэтому вызов виртуальной функции отправляется «неправильной» функции.
Пример Baby:
struct Base
{
virtual int foo() { return 8; }
Base() { set_something(foo()); } // who're you gonna call?
};
struct Derived
{
virtual int foo() { return -12; }
};
Derived d;
Теперь в базовом конструкторе для d.Base()
вызывается функция d.Base::foo()
, а не d.Derived::foo()
.
Более того, к моменту запуска конструктора базового класса переменная-членtitle
был установлен только на "test"
и еще не был перезаписан присваиванием в производном конструкторе, который выполняется только после завершения базового конструктора.
Вы можетерешить вашу проблему, передав заголовок в конструкторе явно:
class BaseView : public QWidget
{
public:
BaseView(QWidget * parent = 0, QString const & t = "test")
: QWidget(parent), title(t)
{
something.set_title(title);
}
// ...
};
class DerivedView
{
public:
DerivedView(QWidget * parent = 0)
: BaseView(parent, "correct")
{ }
};