2016-07-06 104 views
-1

的C++繼承我有與N-一個抽象類保護成員:抽象參考成員的多態性

class Something { 
protected: 
    UINT someVal; 
    std::vector<SomeType> g_MyVec; 
    // some virtual abstract methods ... 
public: 
    UINT getSomeVal() { return someVal; } 
    std::vector<SomeType> GetVec() { return g_MyVec; } 
} 

class SubClass : public Something { 
public: 
    SubClass() { // no members in this class, all inherited from super 
     someVal = 5; // this sticks 
     g_myVec = { .. correct initialization }; // this doesn't stick 
    } 
} 

該代碼的客戶端執行:

Something* s = &SubClass(); 
s->getSomeVal(); // OK, has 5 in it. 
s->GetVec(); // Nada, it returns 0 size, nothing at all... WHY?! 

啓示是非常讚賞。

+4

你正在服用的臨時的地址???它是一個UB和不正確的代碼。 '子類'在';'之後與矢量一起被銷燬';' – Arunmu

+1

'UINT'的類型是什麼?它是'unsigned int'嗎? uint32_t的? uint16_t? uint8_t?您應該查看'stdint.h'中的類型。 –

+0

@ThomasMatthews看起來像[Windows API數據類型](https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v = vs.85).aspx)(但只是猜測)和你的評論無疑是相關的。 –

回答

4

您正在接受臨時地址。這是一個UB和不正確的代碼。子類被摧毀隨着;

正確方法後向量做這將是(假設沒有C++ 11):

Something* s = new Subclass(); 
s->getSomeVal(); // OK, has 5 in it. 
s->GetVec(); 
delete s; 
+0

'new'和'delete'操作符不是必需的。指針必須在比它指向的對象更小的範圍內使用。在原始代碼中,對象的作用域是一行,指針在它之後被使用。 – ilotXXI