例:
class IGui{
protected:
virtual bool OnClicked(){return false;}
virtual bool OnHover(){return false;}
virtual bool OnScrollBarChange(){return false;}
virtual bool OnTextChange(){return false;}
...
}
class IGuiButton: public IGui{
protected:
virtual bool OnClicked() = 0;
virtual bool OnHover(){
do stuff
return true;}
...
}
关键是为所有可以使用的gui类型提供一个commom接口(interface)(并非所有虚拟都需要被覆盖),然后为按钮提供精简版的特化,但是对于按钮,OnClicked必须存在覆盖。
另外,我认为我应该使按钮按钮不应该覆盖private(因此请使用私有(private)继承,并使用“using Base::Method;”这个花哨的字体来保护特定按钮?
最佳答案
这个问题有很多方面。第一个实际上是一个非常有趣的问题:
答案是肯定的。具有预期的(如果您希望这样做的话)语义:从中间类型派生的类型必须实现虚函数而不是抽象类型。这导致了一种奇怪的情况,即基础不是抽象的,但是派生的类型是...,这将令人惊讶。为此,我会在设计中避免这种情况。
不,这样做没有任何理由或优势。成员函数是public
,protected
还是private
派生类都可以覆盖它。可以通过基本类型调用函数的任何代码仍然可以通过强制转换为基本来调用它。这导致了设计中的另一件事。基类填充了protected
虚拟函数,这意味着它们只能由派生类型访问。这没有定义接口(interface),因此不能这样使用。如果函数/类引用了IGui
或IGuiButton
,则将无法执行很多操作,因为没有公共(public)接口(interface)。从根本上讲,这意味着没有人可以调用任何事件-除非您还滥用友谊来提供对事件处理程序的访问权限,但您应避免使用它。
有不同的选择。我建议在创建自己的方形轮子之前,请先看看过去发明的那些轮子:查看不同的图形框架和库,并尝试了解为什么他们决定如此设计它们。查看差异并尝试确定它们带来的优点/缺点以及哪种选项与您的问题相匹配。用户界面(UI)是一个存在很多现有技术的 Realm ,并且您很可能不会从头开始设计比过去该 Realm 的人们做得更好的事情-您可以这样做,但是落入现成的 Realm 要容易得多其他人以前也有同样的陷阱。
关于c++ - 用纯虚拟覆盖虚拟。可以吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12343837/