什么使得C ++中的抽象类成为一种东西

时间:2011-05-25 20:36:32

标签: c++ visual-studio-2008 abstract-class pure-virtual

  

可能重复:
  What is the difference between a concrete class and an abstract class?

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

我做了一些功课,发现可能是因为我在这个课程中有两个虚拟功能,其中一个是纯虚拟功能。

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

3 个答案:

答案 0 :(得分:4)

  

纯虚拟是虚假的赠品

在C ++中,是的。因为它没有abstract的关键字或等效,公共成语使一个类的抽象是在它声明一个纯虚函数(其防止实例化)。*

出于相同的原因,在C ++没有一个接口和多大区别的抽象类 - C ++接口简单地一类只含有纯虚函数。

*的更新以防止一个类的实例化的另一种方法是声明它的构造(多个)protectedprivate。后者意味着它也不能被子类,但前者并不妨碍子类,所以理论上一个受保护的构造也可以是<击>抽象类的标志的方式来迫使子类。但是,我在实践中从未见过这一点。我相信这是因为抽象类被设计为扩展,实际上它几乎总是意味着它具有虚函数。我们之所以希望它是抽象的,是因为它的某些部分实现还不知道,因此它要在它的子类中定义。这正是纯虚函数的用途。

答案 1 :(得分: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() {}

但课程仍然是抽象的。

答案 2 :(得分:0)

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