如何使用基类的接口?

时间:2012-03-21 22:39:41

标签: c++ inheritance polymorphism

如果我在基类中定义了一个接口并且我通过派生类调用该接口,我发现使用该基类接口的唯一方法是在派生类中使用“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 个答案:

答案 0 :(得分:1)

仅当基类是模板时才需要using。因此,您可以检查是否需要基类作为模板。但AFAIK你不会绕过它,你只需忍受它。

关于虚拟函数调用:性能影响经常被高估。我建议实际测量影响,然后看看是否需要做些什么。

答案 1 :(得分:1)

为什么不声明class A: public B<T>在哪种情况下你不需要using?现在,这在基类中的成员函数开箱即用。要访问基类成员变量,您需要执行您正在执行的操作或通过显式调用this指针(即this->dim_而非仅仅dim_

来访问它们)