2010-06-19 35 views
1

我的印象是QObject禁用了複製構造函數和賦值運算符...爲什麼我能夠編譯這個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 
+0

「Disabled」?在C++中沒有這樣的功能可以「禁用」複製構造函數,賦值運算符或其他任何東西。你是什​​麼意思? – AnT 2010-06-19 07:10:37

+0

AndreyT:可以讓他們私密。但是,當然,任何子類都可以使它們再次公開。無論如何,它們對QObjects沒有意義。 QObject有一個「身份」,當複製或分配它們時,這些假設會中斷。 – 2010-06-19 08:09:57

回答

6

派生類總是可以聲明它自己的拷貝構造函數和賦值操作符。如果基類通過將其禁用並使其未定義而禁用它,派生類當然不能在其自己的實現中調用基類的版本,但它仍然可以實現它們。

1

就像Omnifarious的答案一樣。正如他所說的,你可以實現派生類的拷貝構造函數,但是你將無法使用基類的拷貝構造函數來初始化基類中的數據成員。

如果您沒有指定要初始化基類數據成員的構造函數,編譯器將使用基類的默認構造函數。

相關問題