如何使用基类的接口

how to use interfaces of the base class?

本文关键字:接口 基类 何使用      更新时间:2023-10-16

如果我在基类中定义了一个接口,并且通过派生类调用该接口,那么我发现使用该基类的类接口的唯一方法就是在派生类中使用"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。我需要代码的性能。

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

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

关于虚拟函数调用:性能影响往往被高估。我建议实际测量影响,然后看看是否需要采取措施。