вопрос о наследовании
От: piAnd Россия  
Дата: 15.02.04 16:02
Оценка:
простите если не по форуму вопрос:

struct someParamA
{  ...  };

class someClassA
{
   virtual void Func(someParamA *pParam) {  ...  } //в ф-ии используется поля из someParamA
};


struct someParamB: public someParamA
{  ...  }; //добавлены новые поля

class someClassB: public someClassA
{
   virtual void Func(someParamA *pParam) {  ...  } //в ф-ии используется поля из someParamB
};



Мне нужно, чтобы в someClassB в Func() не обрабатывалась структура, если она не является someParamB !!! (т.к. можно заслать туда и someParamA)

Подскажите как это сделать? Если на RTTI, то приведите что искать поконкретнее.

PS: если есть иное решение такой задачи (с наследованием), то оч. хочется посмотреть.
Re: вопрос о наследовании
От: Ignoramus  
Дата: 15.02.04 18:57
Оценка:
Здравствуйте, piAnd, Вы писали:

A>Мне нужно, чтобы в someClassB в Func() не обрабатывалась структура, если она не является someParamB !!! (т.к. можно заслать туда и someParamA)


A>Подскажите как это сделать? Если на RTTI, то приведите что искать поконкретнее.


A>PS: если есть иное решение такой задачи (с наследованием), то оч. хочется посмотреть.


Имхо, наследование здесь ни при чем.

Вопрос можно сформулировать и по-другому: как заставить функцию принимать параметр, если он одного типа и отвергать если он другого типа. А если параметр типа int someParamC, передается как (someParamA*)&someParamC? Такой вариант Вам в голову не приходил?
Re: вопрос о наследовании
От: Dmi3evS Россия http://dmi3s.blogspot.com/
Дата: 15.02.04 19:59
Оценка: 10 (2)
Здравствуйте, piAnd, Вы писали:

A>
A>struct someParamA
A>{  ...  };
A>struct someParamB: public someParamA
A>{  ...  }; //добавлены новые поля
A>
A>class someClassA
A>{
A>   virtual void Func(someParamA *pParam) {  ...  } //в ф-ии используется поля из someParamA
A>};
A>class someClassB: public someClassA
A>{
A>   virtual void Func(someParamA *pParam) {  ...  } //в ф-ии используется поля из someParamB
A>};
A>

A>Мне нужно, чтобы в someClassB в Func() не обрабатывалась структура, если она не является someParamB !!! (т.к. можно заслать туда и someParamA)

A>Подскажите как это сделать? Если на RTTI, то приведите что искать поконкретнее.


Вариант 1. (RTTI)
class someClassB: public someClassA
{
  virtual void Func(someParamA *pParamA) 
  { //в ф-ии используется поля из someParamB
    if ( someParamB* pParamB= dynamic_cast<someParamB*>(pParamA) )
    {
       // использование pParamB
    }
  } 
};

Недостатки: Не дешев по скорости.

Вариант 2. (Двойная диспетчеризация)

class someClassA;
class someClassB;

struct someParamA
{
  virtual void Visit( someClassA* );
  virtual void Visit( someClassB* );
};
struct someParamB: public someParamA
{  
  virtual void Visit( someClassA* );
  virtual void Visit( someClassB* );
}; //добавлены новые поля

class someClassA
{ 
public:
   void Func(someParamA* pA ) { pA->Visit(this); }
   void FuncA(someParamA *pParam) {} //в ф-ии используется поля из someParamA
};
class someClassB: public someClassA
{
public:
   void FuncB(someParamB *pParam) {} //в ф-ии используется поля из someParamB
};

void someParamA::Visit( someClassA* pA ) { pA->FuncA(this); }
void someParamA::Visit( someClassB* pB ) { /* do nothing*/ }

void someParamB::Visit( someClassA* pA ) { /* do nothing*/ }
void someParamB::Visit( someClassB* pB ) { pB->FuncB(this); }


Недостатки/достоинтсва см.
http://www.rsdn.ru/?res/book/cpp/cpp_real_programmers.xml
Автор(ы): Джефф Элджер
Эта книга сборник творческих идей и головоломок продвигающая вас к высшему
знанию С++. Книга ориентированна на программистов, обладающим опытом
программирования на С++.

или паттерн "visitor" в книге GoF:
http://www.rsdn.ru/?res/book/oo/design_patterns.xml
Автор(ы): Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес
В предлагаемой книге описываются простые и изящные решения типичных задач,
возникающих в объектно-ориентированном проектировании. Паттерны появились
потому, что многие разработчики искали пути повышения гибкости и степени
повторного использования своих программ. Найденные решения воплощены в краткой и
легко применимой на практике форме. Авторы излагают принципы использования
паттернов проектирования и приводят их каталог. Таким образом, книга
одновременно решает две задачи. Во-первых, здесь демонстрируется роль паттернов
в создании архитектуры сложных систем. Во-вторых, применяя содержащиеся в
справочнике паттерны, проектировщик сможет с легкостью разрабатывать собственные
приложения. Издание предназначено как для профессиональных разработчиков, так и
для программистов осваивающих объектно-ориентированное проектирование.
Re[2]: вопрос о наследовании (1/2 ОФФ)
От: Dmi3evS Россия http://dmi3s.blogspot.com/
Дата: 15.02.04 20:33
Оценка:
I>А если параметр типа int someParamC, передается как (someParamA*)&someParamC?
1. Найти автора.
2. Оторвать руки, по возможности.
Re[2]: вопрос о наследовании
От: Аноним  
Дата: 15.02.04 23:22
Оценка:
Здравствуйте, Dmi3evS, Вы писали:

спасибо, 1й вариант то что надо! =))

DS>Недостатки/достоинтсва см.

DS>http://www.rsdn.ru/?res/book/cpp/cpp_real_programmers.xml
Автор(ы): Джефф Элджер
Эта книга сборник творческих идей и головоломок продвигающая вас к высшему
знанию С++. Книга ориентированна на программистов, обладающим опытом
программирования на С++.

DS>или паттерн "visitor" в книге GoF:
DS>http://www.rsdn.ru/?res/book/oo/design_patterns.xml
Автор(ы): Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес
В предлагаемой книге описываются простые и изящные решения типичных задач,
возникающих в объектно-ориентированном проектировании. Паттерны появились
потому, что многие разработчики искали пути повышения гибкости и степени
повторного использования своих программ. Найденные решения воплощены в краткой и
легко применимой на практике форме. Авторы излагают принципы использования
паттернов проектирования и приводят их каталог. Таким образом, книга
одновременно решает две задачи. Во-первых, здесь демонстрируется роль паттернов
в создании архитектуры сложных систем. Во-вторых, применяя содержащиеся в
справочнике паттерны, проектировщик сможет с легкостью разрабатывать собственные
приложения. Издание предназначено как для профессиональных разработчиков, так и
для программистов осваивающих объектно-ориентированное проектирование.
Re[3]: вопрос о наследовании
От: Павел Кузнецов  
Дата: 16.02.04 07:48
Оценка: 3 (2)
Здравствуйте, , Вы писали:

> спасибо, 1й вариант то что надо! =))


Учти: если структура someParamA не содержит виртуальных функций, этот вариант
работать не будет.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: вопрос о наследовании
От: piAnd Россия  
Дата: 16.02.04 12:05
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Учти: если структура someParamA не содержит виртуальных функций, этот вариант

ПК>работать не будет.

А в MSDN ничего про виртуальные ф-ии не написано (?):

If the type of expression is a base class of the type of type-id, a run-time check is made to see if expression actually points to a complete object of the type of type-id. If this is true, the result is a pointer to a complete object of the type of type-id. For example:

class B { ... };
class D : public B { ... };

void f()
{
   B* pb = new D;                     // unclear but ok
   B* pb2 = new B;

   D* pd = dynamic_cast<D*>(pb);      // ok: pb actually points to a D
   ...
   D* pd2 = dynamic_cast<D*>(pb2);   // pb2 points to a B not a D
                                    // cast was bad so pd2 == NULL

Исправлено форматирование. Пожалуйста, пользуйтесь тегами [q] ... [/q] для оформления цитат. -- ПК.
Re[5]: вопрос о наследовании
От: WolfHound  
Дата: 16.02.04 12:09
Оценка: 1 (1)
Здравствуйте, piAnd, Вы писали:

A>А в MSDN ничего про виртуальные ф-ии не написано (?):

Малоли о чем забыли в MSDN написать... Без виртуальных функций работать не будет.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: вопрос о наследовании
От: piAnd Россия  
Дата: 16.02.04 12:17
Оценка:
Здравствуйте, WolfHound, Вы писали:
WH>Малоли о чем забыли в MSDN написать... Без виртуальных функций работать не будет.
а с виртуальным деструктором будет работать?
Re[7]: вопрос о наследовании
От: jazzer Россия Skype: enerjazzer
Дата: 16.02.04 12:22
Оценка: 1 (1)
Здравствуйте, piAnd, Вы писали:

A>Здравствуйте, WolfHound, Вы писали:

WH>>Малоли о чем забыли в MSDN написать... Без виртуальных функций работать не будет.
A>а с виртуальным деструктором будет работать?

будет
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: вопрос о наследовании
От: Tonal- Россия www.promsoft.ru
Дата: 16.02.04 16:24
Оценка:
Здравствуйте, piAnd, Вы писали:

A>
A>struct someParamA
A>{  ...  };

A>class someClassA
A>{
A>   virtual void Func(someParamA *pParam) {  ...  } //в ф-ии используется поля из someParamA
A>};


A>struct someParamB: public someParamA
A>{  ...  }; //добавлены новые поля

A>class someClassB: public someClassA
A>{
A>   virtual void Func(someParamA *pParam) {  ...  } //в ф-ии используется поля из someParamB
A>};
A>



A>Мне нужно, чтобы в someClassB в Func() не обрабатывалась структура, если она не является someParamB !!! (т.к. можно заслать туда и someParamA)


A>Подскажите как это сделать? Если на RTTI, то приведите что искать поконкретнее.


Помоему самое простое это добавить в структуру поле размера, и по нему проверять, например:
struct someParamA {
  size_t my_size;
  ...  
};

void someClassA::Func(someParamA *pParam) {
  if (pParam->my_size < sizeof(someParamA))
    throw "Opanki!";
  ....
}

void someClassB::Func(someParamA *pParam) {
  if (pParam->my_size < sizeof(someParamB))
    throw "Opanki!";
  ....
}


Оно конечно "некошерно", но имеет некоторые приимущества по скорости и размеру по сравнению с dynamic_cast и двойной диспечеризацией.
... << RSDN@Home 1.1.3 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.