Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 允许其他基类实现虚拟函数_C++_C++11_Multiple Inheritance - Fatal编程技术网

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

C++ 允许其他基类实现虚拟函数,c++,c++11,multiple-inheritance,C++,C++11,Multiple Inheritance,是否可以执行以下操作: 我的基类有3个纯虚函数。我的派生类实现了其中的两个虚拟函数,并继承了另一个实现最后第三个虚拟函数的类 我当前的代码无法编译,所以我认为这是无效的?虽然如果我能以某种方式使用这种方法会很好。下面是我对这种方法的实际应用 我可以用什么不同的方法来实现这个功能 class ListBox { public: virtual void onScroll() = 0; virtual void foo() = 0; virtual void bar() =

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

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

我可以用什么不同的方法来实现这个功能

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("foo\n");
    }

    void bar() override
    {
        printf("foo\n");
    }

    HorzListBox()
        : ListBox(), DragScrollHandler()
    {

    }
};
我可以用什么不同的方法来实现这个功能

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("foo\n");
    }

    void bar() override
    {
        printf("foo\n");
    }

    HorzListBox()
        : ListBox(), DragScrollHandler()
    {

    }
};
使派生类实现传递给另一个基类实现

class HorzListBox: public ListBox, public DragScrollHandler
{
public:
    void foo() override
    {
        printf("foo\n");
    }

    void bar() override
    {
        printf("foo\n");
    }

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

    HorzListBox()
        : ListBox(), DragScrollHandler()
    {

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

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

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


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

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

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

void onScroll() override {
   DragScrollHandler::onScroll();
}
这将实现契约:实现抽象并使用继承的实现

class HorzListBox: public ListBox, public DragScrollHandler
{
public:
    void foo() override
    {
        printf("foo\n");
    }

    void bar() override
    {
        printf("foo\n");
    }

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

    HorzListBox()
        : ListBox(), DragScrollHandler()
    {

    }
};
但最好的方法(在您的情况下)可能是分离概念,并具有可滚动的

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 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("foo\n");
    }

    void bar() override
    {
        printf("foo\n");
    }

    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>>{};
}
struct列表框{
虚拟~ListBox(){}
虚拟void onScroll()=0;
虚拟void foo()=0;
虚拟空心条()=0;
};
模板
结构DragScrollHandler:T{
void onScroll()重写{}
};
模板
结构HorzListBox:T{
void foo()重写{}
void bar()重写{}
};
int main(){
ListBox*lb=新的HorzListBox{};
}