visualstudio2008-是什么让某些东西成为C++中的抽象类

visual studio 2008 - What makes something an Abstract Class in C++

本文关键字:C++ 抽象类 是什么 visualstudio2008-      更新时间:2023-10-16

可能重复:
具体类和抽象类之间有什么区别?

当我把光标放在其中一个类上时,它告诉我这是一个抽象类。现在我知道这是一个抽象类,因为这就是这个练习的内容,但我很好奇是什么让Integense的东西知道这是个抽象类。

我做了一点家庭作业,发现这可能是因为我在这节课上有两个虚拟函数,其中一个是纯虚拟函数。

纯粹的虚拟是一个致命的赠品吗?还是有其他东西可以告诉你你正在处理或查看一个抽象类?

纯虚拟是一个致命的赠品吗

在C++中,是的。由于它没有abstract关键字或等效关键字,使类抽象的常见习惯用法是在其中声明一个纯虚拟函数(防止实例化)。*

出于同样的原因,在C++中,接口抽象类之间没有太大区别——C++接口只是一个只包含纯虚拟函数的类。

*更新:防止类实例化的另一种方法是声明其构造函数protectedprivate。后者意味着它也不能被子类化,但前者并不阻止子类化。因此,理论上,受保护的构造函数也可以是抽象类的符号,这是强制子类化的一种方式。然而,我从未在实践中见过这种情况。我相信这是因为抽象类是为了扩展而设计的,这在实践中几乎总是意味着它具有虚拟函数。我们之所以希望它是抽象的,是因为它实现的某些部分尚不清楚,因此它将在其子类中定义。这正是纯虚拟函数的意义所在。

使类抽象的唯一原因是它是否具有一个或多个未实现的纯虚拟函数,可能是派生函数。

struct A {                    // abstract
    virtual void f() = 0;
};
struct B : public A {        // abstract
};
struct C : public B {        // not abstract
    void f() {}
};

注意,A还应该有一个(可能不是纯的)虚拟析构函数。

也可以实现纯虚拟功能,但这种情况非常罕见:

struct D {
    virtual void f() = 0;
};

必须在类之外定义函数:

void D :: f() {}

但是这个类仍然是抽象的。

我不会说我是C++专家,但我会说你已经搞定了。纯虚拟方法的存在意味着类不能实例化,因此是抽象。如果所有方法都是纯虚拟的(即没有实现),那么它将是接口,在这种情况下,您只需要头文件。