Виртуальные функции в шаблоне Proxy в C ++ - PullRequest
2 голосов
/ 22 августа 2011

Если у меня есть прокси-шаблон Class A, а прокси для него - Class PrxA.Вопрос1

Если я определю несколько функций как virtual в A, должны ли они быть определены как virtual даже в PrxA?

Теперь, если

Class B : public A
{
///code
}

Я считаю, что прокси-класс также должен наследовать.

Class PrxB : public PrxA {
/// code
}

Теперь при условии, что эти прокси-классы имеют следующие правила

  1. Создание исходного класса в c'tor
  2. Будет передано внутри для любой ссылки /указатель param, передаваемый через различные внутренние классы
  3. Чтобы получить фактический impl прокси-класса (т.е. получить A из PrxA, у нас есть хранилище impl, которое даст нам A из PrxA иB из PrxB.

Теперь есть класс C, который принимает PrxA в качестве ссылки в своем c'tor.

`C :: C (PrxA & A): pa (A), a (getImpl (PrxA))

Локальные члены класса C, которые инициализируются.

PrxA& pa;
A& a;

Если я передам A, это будет отлично работать. Нет проблемздесь.

Вопрос2 Когда я передаю B этому классу C, как лучше всего получить значение B (второе, инициализированное в c't'оре C? (примечание Bполученный из A)

Я могу подумать о приведении в getImpl(A) что-то вроде этого, но не похоже на хороший soln.

A* getAImpl(PrxA& pa)
{
  if (implA(pa) != NULL)
    return A;
  else
    return dynamic_cast<B>(A); // can't do this. since A will be returned but I actually need B
}

Какой подход я должен использовать здесь, если мне нужно передать PrxB в классы, такие как C, которые используют PrxA в качестве эталона?Есть ли какой-то подход, чем кастинг.

Также интересно здесь, если мы ограничимся одним конструктором, мы можем получить ссылку PrxA или PrxB, которую необходимо обработать соответствующим образом, чтобы получить impl в инициализаторах.Мне нужно знать хороший подход.

1 Ответ

0 голосов
/ 22 августа 2011

Если я определю несколько виртуальных функций в A, должны ли они быть определены как виртуальные даже в PrxA?

Только если вы намереваетесь использовать PrxA, в то же время имея возможность рассматривать PrxA как полиморфный базовый класс. (Из остальной части вашего поста видно, что это так.)

`C :: C (PrxA & A): pa (A), a (getImpl (A)) Если я сдаю А, это будет отлично работать. Здесь нет проблем. Когда я передаю B в этот класс C, каков наилучший способ получить impl B (второй инициализируется в c'tor C? (Примечание B получено из A)

Это то, где вещи путаются ... Вы не можете пропустить A здесь, если A не получено из PrxA ... Вам нужно быть немного более точным в своей формулировке или использовать код для объяснения.

Если вы передаете PrxB (опять же, а не B) и PrxB наследуется от PrxA (который вы показали), то, поскольку PrxB должен реализовывать тот же интерфейс, что и PrxA (применяя принцип подстановки Лискова), вы должны иметь возможность получить A & от PrxB точно так же. Это включает в себя случай, который вам требуется для получения экземпляра A & to B, при условии, что B получен из A.

Какой подход я должен использовать здесь, если мне нужно передать PrxB классам, подобным C, которые используют PrxA в качестве эталона?

Поскольку вы показали, что PrxB происходит от PrxA, тогда это должно работать нормально, поскольку вы принимаете PrxA, и это может быть ссылкой на экземпляр PrxB, без проблем.

...