我正在考虑以下事项:
它说C ++中的抽象类包含一个纯虚函数。但是,当然这并不意味着创建一个抽象类我所做的就是插入一个纯虚函数?难道我不具备这样的情况:我有一个具体的类,它不能为一个特定的函数提供实现,因此使它成为抽象的,迫使派生类提供实现?这不会使课程抽象化吗?
那么我如何区分"这是一个抽象类"和#34;这是一个具有一个纯虚函数的具体类"?
答案 0 :(得分:2)
当一个类具有一个或多个纯虚函数时,它会被抽象地抽象。如果你编写了一个(基础)类,它实现了所有函数,因此可以实例化,但它错过了一个重要的函数,那么它就是你的类的错误设计。 在这种情况下,您的基类将不完整,应添加纯虚拟未实现函数,这使它成为一个抽象类。
如果你有一个派生类,它派生自一个抽象类,并且没有实现基类中的所有函数,那么它又是抽象的。在这种情况下,它本身不需要纯虚函数,因为它是继承的抽象。
abstract
中没有C++
个关键字,就像在Java
中一样,表示某个类是抽象的。
答案 1 :(得分:1)
如上所述,根据定义,C ++中的抽象类是一个至少有一个纯虚函数的类。这个类是抽象的意味着你不能创建它的实例(只有从它派生的“具体”类),这可以保护你不要调用“不存在的”纯虚函数(尽管从技术上讲你仍然可以从基类构造函数中调用它们) /析构函数并导致令人讨厌的运行时崩溃。)
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)添加一些其他纯虚方法。