2012-03-21 2 views
1

Если я определил интерфейс в базовом классе, и я вызываю этот интерфейс через производный класс, единственный способ, которым я нашел использовать интерфейс класса базы, - это «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. Мне нужна производительность из кода.

+1

Ранняя оптимизация ... вы уверены, что не можете использовать виртуальные методы? Несколько указателей указателей могут сэкономить вам, чтобы ввести ошибки, которые трудно найти, и они упростят чтение кода. ** Вы действительно уверены? *** –

+0

Это две функции с разными именами, вы все равно не используете функцию базового класса в производном классе. –

+0

@ C-xC-t Я не был уверен, как сформулировать заголовок. Но я имел в виду вызов outB из main. поскольку указатель ap имеет тип A, не должен ли я иметь доступ к интерфейсам класса B, класс, из которого A выводится, из основного? –

ответ

1

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

+0

спасибо, я отставлен. Мне нужно настроить snipmate или что-то в этом роде. Прошу прощения за немой вопрос. благодаря всем за помощь и дополнительную информацию. –

1

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

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

+0

Не могу согласиться больше, штраф за производительность «виртуальными» должен быть последним, о чем вам следует беспокоиться. –

Смежные вопросы