在GTKmm上的documentation examplemore complex clock example上,它们继承了public Gtk::DrawingArea来构建应用程序。

#ifndef GTKMM_EXAMPLE_MYAREA_H
#define GTKMM_EXAMPLE_MYAREA_H

#include <gtkmm/drawingarea.h>

class MyArea : public Gtk::DrawingArea
{
public:
  MyArea();
  virtual ~MyArea();

protected:
  //Override default signal handler:
  bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) override;
};

#endif // GTKMM_EXAMPLE_MYAREA_H


是否可以按组成使用DrawingArea,而不是继承它并覆盖on_draw虚拟方法?

我想这样做,不要将我的方法/属性与从基类DrawingArea继承的Gtk::DrawingArea方法混合使用。因此,当我访问某些内容时,我明确知道我正在创建内容时使用某些内容,因为类定义中只有我的内容。通过从Gtk::DrawingArea继承东西,我不能确定是我的东西还是Gtk::DrawingArea东西,除非我知道Gtk::DrawingArea上定义的所有内容。

最佳答案

简短的回答:不(至少出于您的关注),它不是按照这种方式设计的。

更长的答案:


  我想这样做,不要将我的方法/属性与
  从基类Gtk :: DrawingArea继承的DrawingArea方法。


我认为,不应选择公共继承与组成为标准,因为它们具有非常明确的概念意义。从基类公开继承的子类意味着(大多数情况下,请参见下文)这两个类具有is-a关系。组成表示has-a关系。

因此,要回答您的问题,您应该问自己两个类(您自己的类和Gtk::DrawingArea)之间的确切关系是什么。您的课堂是某种绘画区域吗?如果是这样,我建议公开继承。您的课程是否有(或包含)绘图区域?在那种情况下,我建议组成。

如果您违反了这些概念,几乎可以肯定会遇到难以使用且类不一致的问题,并且最不用担心区分哪个方法是哪个类。

最后,请注意,关于继承的内容远不止这里写的,而且还存在一些异常。有关更深入的讨论,请参见this post

希望这可以帮助!

08-04 12:09