Используйте значение производного класса из базового класса - PullRequest
1 голос
/ 03 февраля 2012

Попытка создать виджет в базовом классе, и единственное, что изменится в виджете в зависимости от того, какой производный класс мы называем, это заголовок.

class BaseView : public QWidget {
    Q_OBJECT
public:
     explicit BaseView(QWidget *parent = 0);
protected:
     QString title; 
     virtual QString getTitle() const {
         return title;
     }

BaseView.cpp:

BaseView::BaseView(QWidget *parent) : QWidget(parent) {

     title = "test"
}

void BaseView::createTopWidget() {
    QGroupBox *topWidget = new QGroupBox(getTitle());
    ....
}

В заголовке производного класса:

class DerivedView : public BaseView {
    Q_OBJECT
public:
     explicit DerivedView(QWidget *parent = 0);
protected:
     QString getTitle() const {
         return title;
     }

И в производном конструкторе я установил title как «правильный».

Когда я запускаю программу, создавая DerivedView, заголовок остается "test".Как я могу это сделать, чтобы я позвонил и получил значение производного класса от базового класса?

1 Ответ

2 голосов
/ 03 февраля 2012

Если вы не очень хорошо разбираетесь в 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")
    { }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...