代码之家  ›  专栏  ›  技术社区  ›  riderchap

C++中抽象类机制有何特殊之处?

  •  2
  • riderchap  · 技术社区  · 15 年前

    我有个问题困扰了我好几天。

    抽象类是一种特殊的类,我们不能实例化它,对吧?(通过给至少一个方法声明一个“=0”来表示/指定,这看起来像是事后的考虑)。

    抽象类机制给C++带来的额外好处是什么“正常”基类无法实现?

    5 回复  |  直到 15 年前
        1
  •  7
  •   Wyatt Anderson    15 年前

    根据 wikibooks section on abstract classes :

    这是在类设计器和该类的用户之间强制执行协定的一种方式。如果我们想从抽象类创建一个具体类(一个可以实例化的类),我们必须为基类的每个抽象成员函数声明并定义一个匹配的成员函数。

    如前所述,这是一种定义 接口 派生类必须遵守的。他们的例子 Vehicle 抽象类非常恰当:你永远不会只有一个 车辆 在现实生活中,你可能会有一辆福特探险家或丰田普锐斯,但这两款车都符合(为了论证)一套基本的功能,即 车辆 可以定义。但是,你不能只是去 车辆 经销商和驾驶a 车辆 离开停车场。因此,您永远不会希望能够构造和使用 车辆 对象,在这里您需要一个专门的派生对象。

        2
  •  2
  •   Steve Townsend    15 年前

    这提供了C++中最好的方法来定义一个没有缺省实现的接口。

    C++没有C语言的 interface 概念。

        3
  •  1
  •   EboMike    15 年前

    它相当于Java变成了“接口”。基本上,它意味着类本身是不可用的——您需要重写所有纯方法。

    一个例子是MFC的CView类,它有一个纯OnDraw方法——基本的CView不做任何事情,因此毫无用处。你必须重写OnDraw。

    (顺便说一句,仍然可以为纯方法提供实现,而子类实现可以回溯到它,但它们仍然必须提供自己的重写。)

        4
  •  0
  •   Cratylus    15 年前

    它们被用作类层次结构设计中的基类。
    抽象类用于为所有派生类定义一个干净的接口。
    在设计阶段,抽象类根据规范定义接口,派生类相应地实现所需的功能。
    另外,使用抽象类而不是“普通”类有助于将实现细节与接口分离。
    具体类实现接口,但抽象类定义接口。您可以在设计中使用具体类作为基类,但抽象类不能直接在代码中使用,也不能被实例化。它们是原型。
    正如您所说,通过使用“normal”类,您必须为所有方法定义一个实现。

        5
  •  0
  •   Matthieu M.    15 年前

    不要在课堂上考虑这个问题。

    看看这个方法,想想它在默认情况下应该做什么:

    virtual std::string getName() const = 0;
    

    这个方法的正确实现是什么?没有比我想象的更糟的了。

    通过将其标记为“纯虚拟”,可以确保如果用户从您的接口获得类的实例,则此方法将具有合理的行为。

    唯一的办法是 throw NotImplemented("getName"); 但是你会在运行时发现这个问题,而不是在编译时,这不是很好:)

    推荐文章