2016-07-06 2 views
-1

У меня есть абстрактный класс с N защищенных членов:C++ Наследование абстрактных эталонных элементов для полиморфизма

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 Похож на [тип данных API Windows] (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

Смежные вопросы