0

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

我正在用 Visual C++ 2008 编写一些东西,在我正在阅读的书中做一个练习,当我将光标悬停在其中一个类上时,它告诉我这是一个抽象类。现在我知道它是一个抽象类,因为这就是本练习的内容,但我很好奇是什么让 Intelisense 知道它是一个抽象类。

我做了一点功课,发现这可能是因为我在这个类中有两个虚函数,其中一个是纯虚函数。

纯虚拟是死的赠品,还是有其他东西可以告诉您正在处理或查看抽象类?

4

3 回答 3

4

纯虚拟是死的赠品吗

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

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

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

于 2011-05-25T20:37:37.973 回答
1

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

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() {}

但该类仍然是抽象的。

于 2011-05-25T20:38:48.200 回答
0

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

于 2011-05-25T20:40:47.887 回答