我正在查看以下内容:
它说 C++ 中的抽象类包含一个纯虚函数。但是,这并不意味着创建一个抽象类我所做的只是插入一个纯虚函数?难道我不能有一个具体的类,它不提供一个特定函数的实现,因此使它抽象,强制派生类提供实现吗?这不会使类抽象吗?
那么如何区分“这是一个抽象类”和“这是一个具有一个纯虚函数的具体类”呢?
我正在查看以下内容:
它说 C++ 中的抽象类包含一个纯虚函数。但是,这并不意味着创建一个抽象类我所做的只是插入一个纯虚函数?难道我不能有一个具体的类,它不提供一个特定函数的实现,因此使它抽象,强制派生类提供实现吗?这不会使类抽象吗?
那么如何区分“这是一个抽象类”和“这是一个具有一个纯虚函数的具体类”呢?
当一个类具有一个或多个纯虚函数时,它就是抽象的。如果您编写一个(基)类,它实现了所有功能,因此可以实例化,但它错过了一个重要功能,那么这只是您的类的错误设计。在这种情况下,您的基类将不完整,应该添加纯虚拟未实现的函数,这使其成为一个抽象类。
如果你有一个派生类,它派生自一个抽象类,并且没有实现基类的所有功能,那么它反过来也是抽象的。在这种情况下,它本身不需要纯虚函数,因为它是通过继承抽象的。
没有abstract
关键字 in C++
,比如 inJava
表示一个类是抽象的。
如上所述,根据定义,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)的其他纯虚方法。