允许其他基类实现虚拟函数
Allow other base class to implement a virtual function
是否可以执行以下操作:
我的基类有 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()
{
}
};
ListBox
和DragScrollHandler
是先验的不同概念,因此在多重继承之间没有一种链接。我的意思是,以某种方式继承的虚拟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。
请重新考虑这些行并相应地修改您的代码。
相关文章:
- 如何正确实现与基类不同的版本?
- 可以具有不同基成员实现的类的最佳实现
- 对派生自同一基类的类实现冲突检查
- 无法使用在子类中定义的虚拟getter实现基类
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- 如何在CRTP实现中传递基类指针
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 如何在子类中重写时调用私有虚拟基类实现
- C++通过映射并使用中的方法从基类实现派生类
- 允许其他基类实现虚拟函数
- 我可以从不同的基类实现对同一函数的不同实现吗?
- CRTP - 如何从派生类调用方法的基类实现
- 为什么C++不允许基类实现派生类的继承接口?
- 从static中派生的基类实现一个虚拟方法
- 使用模板和基类实现灵活的数组成员
- 如何让派生类使用基类实现来满足接口
- 如果我想使用基类实现,为什么我必须在派生类中实现虚函数?
- 基类实现能否代表接口的纯虚拟方法