0

我正在查看以下内容:

http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr142.htm

它说 C++ 中的抽象类包含一个纯虚函数。但是,这并不意味着创建一个抽象类我所做的只是插入一个纯虚函数?难道我不能有一个具体的类,它不提供一个特定函数的实现,因此使它抽象,强制派生类提供实现吗?这不会使类抽象吗?

那么如何区分“这是一个抽象类”和“这是一个具有一个纯虚函数的具体类”呢?

4

2 回答 2

2

当一个类具有一个或多个纯虚函数时,它就是抽象的。如果您编写一个(基)类,它实现了所有功能,因此可以实例化,但它错过了一个重要功能,那么这只是您的类的错误设计。在这种情况下,您的基类将不完整,应该添加纯虚拟未实现的函数,这使其成为一个抽象类。

如果你有一个派生类,它派生自一个抽象类,并且没有实现基类的所有功能,那么它反过来也是抽象的。在这种情况下,它本身不需要纯虚函数,因为它是通过继承抽象的。

没有abstract关键字 in C++,比如 inJava表示一个类是抽象的。

于 2013-06-22T17:52:46.110 回答
1

如上所述,根据定义,C++ 中的抽象类是具有至少一个纯虚函数的类。类是抽象的意味着你不能创建它的实例(只有从它派生的“具体”类),这可以保护你不调用“不存在”的纯虚函数(尽管从技术上讲,你仍然可以从基类构造函数中调用它们/destructor 并获得令人讨厌的运行时崩溃)。

C++ 中没有显式的“接口”类,因此您可以根据需要自由地为任何类中的某些函数提供实现,无论该类是否由于某些其他函数是纯虚拟的而已经是抽象的。

在旁注中,我仍然想指出一种使您的类抽象而不实际使任何“真实”方法成为纯虚拟的方法。使类析构函数成为纯虚拟就足够了(请注意,任何多态类的析构函数无论如何都是虚拟的通常是个好主意)。这里的一个小问题是,在这种特殊情况下(仅适用于析构函数),您仍然必须为其提供一个实现,以使链接器满意。它可能看起来像这样:

class A // abstract class
{
public:
    virtual ~A() = 0 {} // destructor is pure virtual, but still needs a body
};

class B : public A {}; // concrete class deriving from an abstract class

另请注意,在这种特殊情况下,类 B 不必显式实现其自己的析构函数以变得具体,因此,如果您也希望它也是抽象的,则必须再次重复相同的技巧(或添加一些B)的其他纯虚方法。

于 2013-06-22T21:33:24.457 回答