【问题标题】:How can I use the implementation of a base class for a pure virtual method of a interface class?如何将基类的实现用于接口类的纯虚方法?
【发布时间】:2021-10-21 20:31:06
【问题描述】:

我有一个实现虚方法 f() 的 BASE 类。我还有一个 INTERFACE 类,它有一个纯虚方法 f()。然后我有一个继承了 BASE 和 INTERFACE 的 DERIVED 类。当我尝试实例化 DERIVED 时,出现编译器错误“无法实例化抽象类”。

class BASE
{
    public:
    BASE() = default;
    ~BASE() = default;
    virtual void f(){}
};

class INTERFACE
{
    public:
    virtual void f() = 0;
};

class DERIVED :
        public INTERFACE, public BASE
{
    public:
    DERIVED() = default;
    ~DERIVED() = default;
};

BASE 类不知道 INTERFACE,它是库的一部分,我无法更改它。 我读了一些类似的问题,但我找不到关于如何解决这个问题的明确答案。我需要的是能够实例化 DERIVED 并能够在 DERIVED 中以及当我通过 INTERFACE 访问它时使用来自 BASE 的 f()。

【问题讨论】:

  • 你需要在DERIVED中编写函数f(),在其实现中可能会调用BASE::f()
  • DERIVED 应该加上void f(){BASE::f();};
  • godbolt.org/z/Wh8obj84n 实际上编译器的错误是直截了当的.. because the following virtual functions are pure within 'DERIVED': 'virtual void INTERFACE::f()'

标签: c++ inheritance interface abstract-class


【解决方案1】:

因为从未定义过INTERFACEvoid f(),所以BASE 不会从INTERFACE 继承,因此这不是该函数的覆盖。

DERIVED 没有定义 void f(),因此它也不会覆盖 INTERFACE 函数,因此该函数没有主体。

如果您希望它使用 BASE::f 覆盖 INTERFACE::f(),请从 INTERFACE 继承 BASE 或在 DERIVED 中添加覆盖:

void f() override {BASE::f();}

【讨论】:

  • 我可以像这样用自己的函数覆盖函数吗:void f() override {this->f();}
  • 不,这只会导致函数调用自身的无限循环。
猜你喜欢
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2018-06-02
  • 1970-01-01
  • 2016-10-08
  • 2011-08-23
相关资源
最近更新 更多