如何使用基类的接口
how to use interfaces of the base class?
如果我在基类中定义了一个接口,并且通过派生类调用该接口,那么我发现使用该基类的类接口的唯一方法就是在派生类中使用"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你不去绕过它,你只需要接受它。
关于虚拟函数调用:性能影响往往被高估。我建议实际测量影响,然后看看是否需要采取措施。
相关文章:
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- C++:继承自基类和具有公共基接口的多个接口
- 如何在基类中实现子类迭代器的统一接口?
- 使用基类指针 - cpp 的适当声明设计接口
- 您如何将界面称为班级及其基类之间的接口
- 如何私下从基类的导数继承,但实现基类的公共接口?
- 在派生类接口中隐藏基类的特定函数
- 我应该为接口还是抽象基类编程?该短语到底是什么意思
- 基类c++的子类的通用设计接口
- 在C++中实现类似接口的纯抽象基类的最佳实践
- 覆盖基类的虚函数,这些基类不共享公共接口
- c++:通过基类接口构造派生对象
- 为什么C++不允许基类实现派生类的继承接口?
- 如何在基类中使用接口
- 通过抽象模板基类接口指针访问派生类方法,而无需在接口中显式类型
- C++:向基类接口添加一个方法
- 如何通过多态基类接口使用模板化的子类
- 编译时检查基类是否为"接口"
- 如何使用基类的接口
- 基类方法的接口