【问题标题】:how to use interfaces of the base class?如何使用基类的接口?
【发布时间】:2023-04-09 14:32:01
【问题描述】:

如果我在基类中定义了一个接口并通过派生类调用该接口,那么我发现使用该基类接口的唯一方法是在派生类中使用“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&lt;T&gt;::outB; 行,程序将无法编译。 http://ideone.com/x6gm0

一直使用using 的问题在于,如果我有一个很长的派生类链(例如,如果我广泛使用适配器模式),我必须在每个派生类中写using ...; 用于所有继承接口。

在每个派生类中绕过using 的重复以保留基类的接口的好做法是什么?

注意,我想避免使用virtual。我需要代码的性能。

【问题讨论】:

  • 早期优化...你确定不能使用虚方法吗?很少有指针间接可以避免您引入难以发现的错误,并且它们将使您的代码更易于阅读。 你确定吗???*
  • 这是两个名字不同的函数,你并没有在派生类中使用基类的函数。
  • @C-xC-t 我不知道如何表达标题。但我的意思是从 main 中调用 outB。由于 ap 指针属于 A 类型,我是否应该能够从 main 访问 B 类(A 派生的类)的接口?
  • @Adriano,老实说,我还在学习 C++,我跳过了获得虚函数的经验。我使用现代 c++ 和 boost 作为指导。到目前为止,据我所知,可以避免使用虚拟功能;有时通过使用 CRTP。所以我知道它们是什么,并且可以阅读它们,但我尝试采用一种避免它们的风格。

标签: c++ inheritance polymorphism


【解决方案1】:

为什么不声明class A: public B&lt;T&gt;,在这种情况下你不需要using?现在,这对于基类中的 成员函数 来说是开箱即用的。要访问基类成员变量,您要么需要做你正在做的事情,要么通过显式调用this 指针访问它们,即this-&gt;dim_ 而不仅仅是dim_

【讨论】:

  • 谢谢,我智障了。我需要配置 snipmate 或类似的东西。我很抱歉这个愚蠢的问题。感谢大家的帮助和其他信息。
【解决方案2】:

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

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

【讨论】:

  • 完全同意,virtuals 的性能损失应该是您最不应该担心的事情。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2019-08-25
  • 2012-05-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多