弄清楚是什么让VS ++中的C ++类抽象化

时间:2010-04-26 14:54:47

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

我正在使用VS2008构建一个普通的旧C ++程序(而不是C ++ / CLI)。我有一个抽象基类和一个非抽象派生类,并构建它:

Base* obj;
obj = new Derived();

失败并显示错误“'Derived':无法实例化抽象类”。 (但值得注意的是,如果我用光标悬停在Base上,VS会弹出一个工具提示“class base abstract”,但将鼠标悬停在Derived上只会说“class Derived” “(不是”抽象“))。

这些类的定义相当大,我想避免手动检查每个方法是否已被覆盖。 VS能以某种方式为我做这件事吗?有关精确定位类定义的确切部分以使其抽象的一般提示吗?

3 个答案:

答案 0 :(得分:7)

编译器应该在错误消息中告诉您。以下内容:

struct base
{
    virtual void foo(void) = 0;
    virtual void bar(void) = 0;
};

struct derived : base
{
    virtual void foo(void){}
};

int main(void)
{
    derived d;
}

产地:

  

错误C2259:'derived':无法实例化抽象类
  由于以下成员:
  'void base :: bar(void)':是抽象的   见'base :: bar'的声明

动态分配也是如此。

答案 1 :(得分:1)

不,我不相信VS会开箱即用。 见GMan的答案。

另一方面,如果你有一个如此大的基类,你无法快速检查它的虚拟方法,你可能需要考虑分解该类。

答案 2 :(得分:1)

GMan说的话。另外使用更好的编译器:-)使用g ++,错误是:

ab.cpp: In function 'int main()':
ab.cpp:14: error: cannot declare variable 'd' to be of abstract type 'derived'
ab.cpp:8: note:   because the following virtual functions are pure within 'derived':
ab.cpp:4: note:         virtual void base::bar()