2015-06-15 3 views
1

Почему подклассы не разделяют один и тот же частный membervariable в суперклассе, используя полиморфизм? Есть только один экземпляр базового класса, и если SubA устанавливает частный член через мутатор - почему тогда SubB не может получить доступ к этому значению. Как бы это выглядело, если я хочу, чтобы подклассы делили один и тот же частный член?Полиморфизм - подклассы совместного использования базовых членов базового класса

#include <iostream> 
class Super { 

    private: 
    int cnt; 
    public: 
    int getCnt() { 
     return cnt; 
    } 
    void setCnt(int cnt) { 
     this->cnt = cnt; 
    } 
}; 

class SubA: public Super { 

}; 

class SubB: public Super { 

}; 

int main() { 

    Super *super; 
    SubA a; 
    SubB b; 

    super = &a; 
    super->setCnt(10); 
    super = &b; 
    std::cout << super->getCnt() << std::endl; 
    super = &a; 
    std::cout << super->getCnt() << std::endl; 

return 0; 
} 

производит:

-8589546555 (garbage) 
10 
+0

b не инициализируется. Итак, он производит значение для мусора – Technoid

ответ

5

Есть только один экземпляр базового класса, и если Субе

Это неправильно. a и b: различные объекты. Каждый из них имеет экземпляр дополнительного объекта A. Вы не установили cnt в b, поэтому неудивительно, что просмотр его дает вам значение для мусора, потому что чтение из неинициализированного объекта - неопределенное поведение.

Как это выглядело бы, если бы я хотел, чтобы подклассы делились одним и тем же частным членом?

Вы можете указать базовый класс a static данных. Это означает, что все экземпляры A будут иметь один и тот же член.

+0

Мой вопрос не о garbagevalue - я понимаю это уже - просто почему a и b имеют разные экземпляры. – java

+1

@java Вы не спрашиваете * почему * у них разные экземпляры. Вы говорите, что этого не делают, и я говорю вам, что это так, потому что именно так разработан язык. Представьте себе беспорядок, если каждый объект поделился базовым под-объектом со всеми экземплярами его типа! – juanchopanza

+0

@java: для достижения того, что вы хотите, вы можете использовать статическую переменную класса в классе Super – 550

1

Почему подклассы не разделяют одни и те же частные membervariable в суперклассе, используя полиморфизм?

Полиморфизм не имеет ничего общего с тем, как данные внедряются в классы; (время выполнения), имеет значение только для информации о времени отправки и времени выполнения (RTTI) для virtual и для dynamic_cast и type_info.

Если вы представить ваши a и b объекты в стеке, их расположение памяти можно проиллюстрировать следующим образом:

A:[[Super: int cnt;]A-specific fields (if there were any)] 
B:[[Super: int cnt;]B-specific fields (if there were any)] 

В сущности, class A : public Super говорит: «Я, возможно, хотят продлить„Супер“, возможно добавление мои собственные члены данных относятся к Super, возможно добавив дополнительные функции/переопределяя virtual единиц ".

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

Это неправильно ... каждый подклассов встраивает свой собственный экземпляр суперкласса.

Как это выглядело бы, если бы я хотел, чтобы подклассы делились одним и тем же частным членом?

Ну, есть много способов, которыми вы могли бы руководите этим что:

  • Вы мог бы иметь подклассы держать указатели на Data объект, в который вы перемещаете данные суперкласса вы хотите поделиться, то вам понадобится способ инициализировать объект Data и сообщить его всем экземплярам подкласса, которые вы хотите поделиться им.

  • Вы можете сделать данные суперкласса static, что означает, что одна копия каждой переменной static будет использоваться всеми экземплярами суперкласса, независимо от того, встроена ли она в подклассы или нет.

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