允许其他基类实现虚拟函数

Allow other base class to implement a virtual function

本文关键字:基类 实现 虚拟 函数 其他 许其他      更新时间:2023-10-16

是否可以执行以下操作:
我的基类有 3 个纯虚函数。我的派生类实现了其中 2 个虚函数,并从实现最后一个第三个虚函数的另一个类继承。

我当前的代码无法编译,所以我认为这无效?虽然如果我能以某种方式使用这种方法会很棒。以下是我对这种方法的实际应用/使用。

关于我可以用来实现此功能的不同方法的任何建议?

class ListBox
{
public:
    virtual void onScroll() = 0;
    virtual void foo() = 0;
    virtual void bar() = 0;
};
class DragScrollHandler
{
public:
    void onScroll()
    {
        ...
    }
};
class HorzListBox: public ListBox, public DragScrollHandler // could also do public HoverScrollHandler, etc.
{
public:
    void foo() override
    {
        printf("foon");
    }
    void bar() override
    {
        printf("foon");
    }
    HorzListBox()
        : ListBox(), DragScrollHandler()
    {
    }
};

ListBoxDragScrollHandler先验的不同概念,因此在多重继承之间没有一种链接。我的意思是,以某种方式继承的虚拟onScroll与在另一个不相关的(与另一个)分支上实现onScroll之间设置链接并不是自动的。

您可以在HorzListBox上定义它以调用继承的实现:

void onScroll() override {
   DragScrollHandler::onScroll();
}

这将履行契约:实现抽象并使用继承的实现。

但最好的方法(在您的情况下)可能是分离概念并有一个Scrollable

class Scrollable {
public: 
  virtual void onScroll()=0;
};
class ListBox: virtual public Scrollable {
public:
  virtual void foo()=0;
};
class DragScrollHandler: virtual public Scrollable {
public:
  void onScroll() override {...}
};
class HorzListBox: public ListBox, public DragScrollHandler {
public:
  void foo() override {...}
};

关于我可以用来实现此功能的不同方法的任何建议?

使派生类实现传递到其他基类实现。

class HorzListBox: public ListBox, public DragScrollHandler
{
public:
    void foo() override
    {
        printf("foon");
    }
    void bar() override
    {
        printf("foon");
    }
    void onScroll() override
    {
       DragScrollHandler::onScroll();
    }
    HorzListBox()
        : ListBox(), DragScrollHandler()
    {
    }
};

关于我可以用来实现此功能的不同方法的任何建议?

出于好奇,您可以使用基于mixin的方法,如下所示:

struct ListBox {
    virtual ~ListBox() { }
    virtual void onScroll() = 0;
    virtual void foo() = 0;
    virtual void bar() = 0;
};
template<typename T>
struct DragScrollHandler: T {
    void onScroll() override { }
};
template<typename T>
struct HorzListBox: T {
    void foo() override { }
    void bar() override { }
};
int main() {
    ListBox *lb = new HorzListBox<DragScrollHandler<ListBox>>{};
}

我当前的代码无法编译,所以我认为这无效?

当然不会编译!派生类不会覆盖抽象基类的所有纯虚函数,反过来也会成为抽象类本身。这意味着无法实例化派生类,因此会出现编译时错误。

所以在你的例子中,类 HorzListBox 也是一个抽象类,因为它不会覆盖类 ListBox 的所有 PVF。

请重新考虑这些行并相应地修改您的代码。