Если я определил интерфейс в базовом классе, и я вызываю этот интерфейс через производный класс, единственный способ, которым я нашел использовать интерфейс класса базы, - это «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
. Мне нужна производительность из кода.
Ранняя оптимизация ... вы уверены, что не можете использовать виртуальные методы? Несколько указателей указателей могут сэкономить вам, чтобы ввести ошибки, которые трудно найти, и они упростят чтение кода. ** Вы действительно уверены? *** –
Это две функции с разными именами, вы все равно не используете функцию базового класса в производном классе. –
@ C-xC-t Я не был уверен, как сформулировать заголовок. Но я имел в виду вызов outB из main. поскольку указатель ap имеет тип A, не должен ли я иметь доступ к интерфейсам класса B, класс, из которого A выводится, из основного? –