Почему я могу создать конструктор копирования и перегрузить оператор присваивания для подкласса QObject? - PullRequest
1 голос
/ 19 июня 2010

У меня сложилось впечатление, что QObject отключил конструктор копирования и оператор присваивания ... почему я могу скомпилировать эту производную QObject, содержащую оба из них?

#ifndef QVERSION_H
#define QVERSION_H

#include "silverlocklib_global.h"
#include <QtCore>

struct SILVERLOCKLIBSHARED_EXPORT QVersion : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool valid READ isValid)
    Q_PROPERTY(long major READ major)
    Q_PROPERTY(long minor READ minor)
    Q_PROPERTY(long build READ build)
    Q_PROPERTY(long revision READ revision)

public:
    QVersion(long major = 0, long minor = 0, long build = -1, long revision = -1, QObject *parent = NULL);
    QVersion(const QString &version, QObject *parent = NULL);
    QVersion(const QVersion &version);
    static QVersion parse(const QString& version, bool *ok = NULL);
    bool isValid() const;
    long compareTo(const QVersion &other) const;
    bool equals(const QVersion &other) const;
    QString toString() const;
    QString toString(int fieldCount) const;
    long major() const;
    inline int majorRevision() const { return (qint16)(this->m_revision >> 16); }
    long minor() const;
    inline int minorRevision() const { return (qint16)(this->m_revision & 65535); }
    long build() const;
    long revision() const;
    QVersion& operator=(const QVersion &version);
    friend bool operator==(const QVersion &v1, const QVersion &v2);
    friend bool operator!=(const QVersion &v1, const QVersion &v2);
    friend bool operator<(const QVersion &v1, const QVersion &v2);
    friend bool operator<=(const QVersion &v1, const QVersion &v2);
    friend bool operator>(const QVersion &v1, const QVersion &v2);
    friend bool operator>=(const QVersion &v1, const QVersion &v2);

private:
    inline static void copy(QVersion *const destination, const QVersion &source);
    static bool tryParseComponent(const QString &component, long *parsedComponent);

    long m_major;
    long m_minor;
    long m_build;
    long m_revision;
};

#endif // QVERSION_H

Ответы [ 2 ]

6 голосов
/ 19 июня 2010

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

1 голос
/ 19 июня 2010

Так же, как дополнение к всевозможному ответу.Как он сказал, вы можете реализовать конструктор копирования производного класса, но не сможете использовать конструктор копирования базового класса для инициализации членов данных в базовом классе.

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

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