как использовать интерфейсы базового класса? - PullRequest
1 голос
/ 22 марта 2012

Если я определил интерфейс в базовом классе, и я вызываю этот интерфейс через производный класс, я нашел единственный способ использовать интерфейс этого базового класса, используя «using» в производном классе. Я не уверен, что это хорошая практика. Вот пример программы

#include <memory>
#include <iostream>

using namespace std;

template <class T>
class B 
{
public:
  void outB() { cout << "dim from B is " << dim_ << endl ; }
  B(int dim) : dim_(dim) {}
  ~B() {}
protected:
  int dim_;
};

template <class T>
class A : B<T>
{
public:
  using B<T>::dim_;
  using B<T>::outB;
  void outA() { cout << "dim from A is " << dim_ << endl ; }
  A(int dim) : B<T>(dim) {}
  ~A() {}
private:
};


int main(int argc, const char *argv[])
{
  shared_ptr<A<double> > ap(new A<double>(2));
  ap->outA();
  ap->outB();
  return 0;
}

Если я уберу строку using B<T>::outB;, программа не скомпилируется. http://ideone.com/x6gm0

Проблема с использованием using все время заключается в том, что если у меня есть длинная цепочка производных классов (например, если я широко использую шаблон адаптера), я должен написать using ...; в каждом производном классе для всех унаследованных интерфейсы.

Какова хорошая практика обхода повторения using в каждом производном классе, чтобы сохранить интерфейсы базового класса?

Обратите внимание, я бы не хотел использовать virtual. Мне нужна производительность из кода.

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Почему бы не объявить class A: public B<T>, в этом случае вам не понадобится using? Теперь это работает "из коробки" для функций-членов в базовом классе. Чтобы получить доступ к переменным-членам базового класса, вам нужно либо делать то, что вы делаете, либо обращаться к ним через явный вызов this указатель, т.е. this->dim_ вместо просто dim_

1 голос
/ 22 марта 2012

using требуется, только если базовый класс является шаблоном. Таким образом, вы можете проверить, нужен ли вам базовый класс в качестве шаблона. Но AFAIK ты не обойдешься, ты просто должен жить с этим.

Относительно вызовов виртуальных функций: влияние на производительность часто переоценивают. Я рекомендую на самом деле измерить воздействие, а затем посмотреть, нужно ли что-то сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...