使用纯虚拟覆盖虚拟..这样可以吗?

Ice*_*000 1 c++ inheritance pure-virtual

例:

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;}
  ...
}
Run Code Online (Sandbox Code Playgroud)

关键是要为所有gui类型提供一个commom接口(不需要覆盖所有虚拟内容),然后为按钮提供lite特化,但是对于按钮,theres必须是OnClicked的覆盖..

此外,我认为我应该使那些按钮不应该覆盖私有(所以使用私有继承,并使用那个花哨的"使用Base :: Method;"来使特定的保护?

Dav*_*eas 5

这个问题有很多方面.第一个实际上是一个非常有趣的问题:

派生类是否可以使用纯基本的纯虚方法?

答案是肯定的,它可以.有了预期的(如果你期望这个工作)语义:从中间类型派生的类型必须实现虚函数不是抽象类型.这导致了一个奇怪的情况,其中基础不是抽象的,但派生类型是......这将是令人惊讶的.就此而言,我会在设计中避免这种情况.

您是否应该标记为private派生类型的成员不应该覆盖?

不,这样做没有理由或优势.无论是成员函数public,protected还是private派生类都可以覆盖它.任何可以通过基类型调用函数的代码仍然可以通过强制转换为base来调用它.这会在您的设计中引发另一个奇怪的事情.基类充满了protected虚函数,这意味着它们只能由派生类型访问.这不会定义接口,也不能这样使用.如果函数/类接受a的引用IGui,或者IGuiButton它将无法做太多,因为没有公共接口.这基本上意味着没有人能够调用任何事件 - 除非你也滥用友谊来提供对事件处理程序的访问,但你应该避免它.

那么什么是合适的设计?

有不同的选择.我建议在创建自己的方形轮之前,先看看过去发明的那些轮子:查看不同的图形框架和库,并尝试理解为什么他们决定这样设计它们.查看差异并尝试确定它们带来的优势/劣势以及哪个选项符合您的问题.UI是一个有很多现有技术的领域,你很可能不会从头开始设计比过去的人更好的设计 - 你可能会这样做,但它更容易陷入其他人都感受到的相同陷阱.