我正在使用VS2008构建一个普通的旧C ++程序(而不是C ++ / CLI)。我有一个抽象基类和一个非抽象派生类,并构建它:
Base* obj;
obj = new Derived();
失败并显示错误“'Derived':无法实例化抽象类”。 (但值得注意的是,如果我用光标悬停在Base
上,VS会弹出一个工具提示“class base abstract”,但将鼠标悬停在Derived
上只会说“class Derived” “(不是”抽象“))。
这些类的定义相当大,我想避免手动检查每个方法是否已被覆盖。 VS能以某种方式为我做这件事吗?有关精确定位类定义的确切部分以使其抽象的一般提示吗?
答案 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()