抽象类作为参数(接口用例)

Abstract class as argument (interface case)

本文关键字:接口 参数 抽象类      更新时间:2023-10-16

我有一个抽象类应该是一个接口,像这样:

  class IDataSource
    {
    public:
        virtual double getMeThatDouble() = 0;
    }

和一些实现,如

 class IDataSourceStreamer
    {
    public:
        double getMeThatDouble()
          {
            //implementation
          }
    }
关键是我想把它用作其他类的构造函数的初始参数,比如
class DataNeeder
{
  public:
       explicit DataNeeder(IDataSource);
}

麻烦来了——"parameter of abstract class type is not allowed"

我理解它被禁止的特殊原因-使用抽象类本身是不可能的。那我该怎么办呢?是一个类似

的方法
IDataSource.FeedThat(DataNeeder)

是唯一的选择吗?有点丑。

您需要将抽象类型作为引用或指针传递。例如:

class DataNeeder {
public:
    explicit DataNeeder(IDataSource &source) : source_(source) {
    }
    void someMethod() {
        double x = source_.getMeThatDouble();
        // ...
    }
private:
    IDataSource &source_;
}

则可以使DataNeeder的成员函数作用于source_。正如我所提到的,您也可以在此任务中使用指针,但我喜欢仅对"OUT"参数和可能是NULL的东西使用指针。