![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| 46&two |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 6.2.2004 Репутация: нет Всего: нет |
выведет, очевидно, 111. А хотелось бы 123. Вот в этом и вопрос: как сделать так (и вообще возможно ли это), чтобы некоторое статическое свойство базового класса было бы действительным только в пределах экземпляров этого самого класса, а в пределах экземпляров классов наследников это свойство имело бы другое значение - общее для наследника. Статическое свойство s класса parent призвано описывать некоторую общую характеристику экземпляров класса наследника. Делать ее не статической нельзя - характеристика может динамически меняться, к тому же таскать в каждом экземпляре наследника еще и ее характеристики всего класса, надо полагать, не разумно. В общем, если "в лоб" это не разрешимо, то может кто-нибудь уже сталкивался с подобной проблемой и может подсказать вариант решения. |
|||
|
||||
| bel_nikita |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
А так не катит?:
|
||||||
|
|||||||
| 46&two |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 6.2.2004 Репутация: нет Всего: нет |
То bel_nikita:
увы, не катит: проблема в том, что свойство s используется в некоторой функции базового класса. функция задумана так, чтобы использовать именно значения child::s, если она вызвана из экземпляра класса child а в предложенном варианте, откуда не вызывай, все равно будет использоваться parent::s; |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Ага, я так понимаю, надо из базового класса вытащить коечто из производного? Я правильно понял? Тогда можно попытатся поинтер базового класса привезти к производному.
|
|||
|
||||
| 46&two |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 6.2.2004 Репутация: нет Всего: нет |
опять же, использовать всякие касты мне низзя. у меня вообще базовый класс про своих наследников ну ничего не знает. т.е. надо обходиться только интерфесом доступа, описанным в базовом классе, не более того.
Это сообщение отредактировал(а) 46&two - 8.6.2004, 08:53 |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
так нафиг тогда доступ к производному классу? может тогда стоит обойтись без полиморфа |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
А так?:
Вроде выход из твоей ситуации |
|||
|
||||
| achmed |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 12.4.2004 Репутация: нет Всего: нет |
пусть за статическое всойство класса отвечает виртуальная фуикция. class parent { virtual int GetStaticProp(){ return parent::s}; virtual Do() { int a = GetStaticProp(); ..... } static int s; } class child { virtual int GetStaticProp(){ return child::cs} static int cs; } |
||||
|
|||||
| 46&two |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 6.2.2004 Репутация: нет Всего: нет |
To bel_nikita:
Этот вариант мне тоже в голову пришел, но у него тоже минус: GetS - не статическая функция, а значит ее код, грубо говоря, будет тиражироваться для каждого экземпляра этого объекта. а статиком ее сделать нельзя, потому что в родительском классе она виртуальна. To achmed: кстати да. не сильно красиво, конечно - придется один и тот же код описывать во всех классах наследниках - но зато это должно работать. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Можно подправить
что-то я я не понимаю. то говоришь, что статик не надо, то статик надо. опиши суть |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
class Parent
{ private: static int ps; public: virtual int GetS() { return ps;} static void SetS(int v) { ps = v;} }; class Child1: public Parent { private: static int ch1s; public: int GetS() { return ch1s;} static SetS(int v) {ch1s = v;} }; class Child2: public Parent { private: static int ch2s; public: int GetS() { return ch2s;} static SetS(int v) {ch2s = v;} }; int Parent: int Child::ch1s = 0; int Child::ch2s = 0; Parent::SetS(1); Child1::SetS(2); Child2::SetS(3); Parent* p = new Parent(); Parent* p1 = new Child1(); Parent* p2 = new Child2(); cout <<p->GetS() << p1->GetS() << p2->GetS(); -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |