如果我在基类中定义了一个接口并且我通过派生类调用该接口,我发现使用该基类接口的唯一方法是在派生类中使用“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
。我需要代码中的性能。
答案 0 :(得分:1)
仅当基类是模板时才需要using
。因此,您可以检查是否需要基类作为模板。但AFAIK你不会绕过它,你只需忍受它。
关于虚拟函数调用:性能影响经常被高估。我建议实际测量影响,然后看看是否需要做些什么。
答案 1 :(得分:1)
为什么不声明class A: public B<T>
在哪种情况下你不需要using
?现在,这在基类中的成员函数开箱即用。要访问基类成员变量,您需要执行您正在执行的操作或通过显式调用this
指针(即this->dim_
而非仅仅dim_