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: если есть иное решение такой задачи (с наследованием), то оч. хочется посмотреть.
Здравствуйте, piAnd, Вы писали:
A>Мне нужно, чтобы в someClassB в Func() не обрабатывалась структура, если она не является someParamB !!! (т.к. можно заслать туда и someParamA)
A>Подскажите как это сделать? Если на RTTI, то приведите что искать поконкретнее.
A>PS: если есть иное решение такой задачи (с наследованием), то оч. хочется посмотреть.
Имхо, наследование здесь ни при чем.
Вопрос можно сформулировать и по-другому: как заставить функцию принимать параметр, если он одного типа и отвергать если он другого типа. А если параметр типа int someParamC, передается как (someParamA*)&someParamC? Такой вариант Вам в голову не приходил?
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)
{ //в ф-ии используется поля из someParamBif ( 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); }
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Учти: если структура 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
Здравствуйте, piAnd, Вы писали:
A>А в MSDN ничего про виртуальные ф-ии не написано (?):
Малоли о чем забыли в MSDN написать... Без виртуальных функций работать не будет.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали: WH>Малоли о чем забыли в MSDN написать... Без виртуальных функций работать не будет.
а с виртуальным деструктором будет работать?
Здравствуйте, piAnd, Вы писали:
A>Здравствуйте, WolfHound, Вы писали: WH>>Малоли о чем забыли в MSDN написать... Без виртуальных функций работать не будет. 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, то приведите что искать поконкретнее.
Помоему самое простое это добавить в структуру поле размера, и по нему проверять, например: