Когда я наследую класс в C ++, он создает объект базового класса и сохраняет его как переменную-член в производном классе? - PullRequest
2 голосов
/ 18 августа 2010

Скажите, я создаю производный класс, как показано ниже,

    class CHIProjectData : public QObject 
{ 
CHIProjectData(QMap<QString,QString> aProjectData,
                           CHIMetaData* apMetaData = 0,
                           QObject* parent = 0); 
    private:
            QMap<QString,QString> m_strProjectData;
            CHIAkmMetaData* m_pMetaData; 
};

и я реализую как,

CHIProjectData::CHIProjectData(QMap<QString,QString> aProjectData,
                               CHIMetaData* apMetaData,
                               QObject* aParent)
    :m_strProjectData(aProjectData),
    m_pMetaData(apMetaData),
    QObject(aParent)
{

}

я знаю, что инициирую переменные-члены m_strProjectData, m_pMetaData в конструкторе. но что делает последняя часть "QObject (aParent)"? он создает объект базового класса и считает это переменной-членом?

Ответы [ 4 ]

6 голосов
/ 18 августа 2010

QObject(aParent) вызывает конструктор QObject с параметром aParent. QObject не является переменной-членом в этом случае. Это может показаться тонким, но важным моментом, поскольку для доступа к свойствам и методам подобъекта требуется другой синтаксис, чем для переменной-члена.

Вот аналогия, чтобы попытаться понять разницу между подобъектом и переменной-членом.

В фильме "Бэтмен: Темная ночь" есть сцена, где Бэтмен преследует плохого парня в своей машине. Но машина становится поврежденной и непригодной, и ему приходится бежать. В этот момент Бэтмен нажимает кнопку, и часть автомобиля отрывается от остальных, превращаясь в мотоцикл. Это что-то вроде подобъекта. Автомобиль - это мотоцикл.

Теперь рассмотрим случай, когда Р.В. буксировал меньший автомобиль, подобные которому часто можно увидеть на американских автострадах. В этом случае RV имеет транспортное средство . Автомобиль является переменной-членом RV.

1 голос
/ 18 августа 2010

По сути, это то, что происходит под капотом. Части базового класса вашего объекта, как и его члены данных, называются подобъектами .

Понятие инициализации базы, как в QObject(aParent), похоже на инициализацию члена, но базы всегда инициализируются первыми. Следовательно, было бы яснее перечислить QObject перед членами, поэтому список инициализаторов находится в хронологическом порядке.

Порядок инициализации всегда следует порядку, в котором базы названы в честь class, и порядку, в котором объявлены члены, независимо от того, как записана последовательность инициализатора.

0 голосов
/ 18 августа 2010

Не совсем. Он сообщает конструктору базового класса, что делать. Представьте себе этот класс:

class A
{
public:
  A(int val)
    : value(val)
  {
  }
protected:
  int value;
};

Чтобы построить A, вы должны передать int. Это всегда так, даже если вы унаследовали это.

Скажем, вы класс B, который происходит от A. Вы являетесь и A, но вы все еще должны сказать A части вашего класса, как создать себя:

class B : public A
{
public:
  B()
    : A(5)
  {
  }

  int GetValue()
  {
    return value;
  }
};

Члены A становятся вашими членами, потому что вы и A.

В машинной памяти сценарий такой же, как вы описали, но только в простых случаях. Это становится более сложным с виртуальными функциями, множественным наследованием и виртуальным наследованием. Если вы придерживаетесь отношений is-a и has-a, то можете избежать некоторых головных болей:)

0 голосов
/ 18 августа 2010

Экземпляр класса, который является базой производного класса, иногда называется «подобъектом базового класса», поэтому в некотором смысле базовый класс является отдельной «частью» вашего производного класса.

В списке инициализатора вашего конструктора, QObject(aParent) выбирает способ построения базового класса. В этом случае используется конструктор с одним параметром. Если бы базовый класс был исключен из списка инициализатора конструктора вашего производного класса, то был бы использован его конструктор по умолчанию.

Это не строго переменная-член, хотя, как и переменная-член, она является составной частью вашего производного класса наряду с любыми другими подобъектами базового класса и другими членами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...