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{};
}