弄清楚是啥让 VS2008 中的 C++ 类抽象

Posted

技术标签:

【中文标题】弄清楚是啥让 VS2008 中的 C++ 类抽象【英文标题】:Figuring out what makes a C++ class abstract in VS2008弄清楚是什么让 VS2008 中的 C++ 类抽象 【发布时间】:2010-04-26 14:54:46 【问题描述】:

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

Base* obj;
obj = new Derived();

失败并出现错误“'Derived':无法实例化抽象类”。 (然而,值得注意的是,如果我将光标悬停在 Base 上,VS 会弹出一个工具提示说“类 Base abstract”,但悬停在 Derived 上只会说“类派生”(没有“摘要"))。

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

【问题讨论】:

【参考方案1】:

编译器应该在错误信息中告诉你。以下:

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:“派生”:无法实例化抽象类 由于以下成员: 'void base::bar(void)' : 是抽象的 见'base::bar'的声明

动态分配也是如此。

【讨论】:

确实,我忘了检查输出窗口(再次)。冒犯的方法已被发现,并因其不守规矩的行为而受到谴责。 :)【参考方案2】:

不,我不相信 VS 开箱即用。 请参阅 GMan 的回答。

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于弄清楚是啥让 VS2008 中的 C++ 类抽象的主要内容,如果未能解决你的问题,请参考以下文章

是啥让某些 android 类“必须保留”?

是啥让用户定义的类不可散列?

如何在VS2008中使用集成单元测试来测试抽象类

找出是啥让我在 torch7 中记忆犹新

VS2008(C++)-控制台项目中LNK2005错误的问题

是啥让某些东西成为 ASP.NET Core 中的请求功能?