具有多态性编译问题的简单文件

时间:2010-12-18 12:52:05

标签: c++ polymorphism virtual

我有编译一些非常简单的代码的问题,我不知道它有什么问题:/ 看看:

class A{
public:
    virtual void func() = 0;
};

class B : public A
{
public:
    virtual void func() {};
};

int main()
{
    A* obj = new B();
    return 0;
}

这是我从g ++获得的信息:

Info: resolving vtable for _cxxabiv1::__si_class_type_info by 
    linking to __imp __ZTVN10__cxxabiv120__si_class_type_infoE (auto-import) 
Info: resolving vtable for __cxxabiv1::__class_type_info by 
    linking to __imp___Z TVN10__cxxabiv117__class_type_infoE (auto-import) 
k:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: 
warning: auto-importing has been activated without 
    --enable-auto-import specified on the c ommand line. This should work 
    unless it involves constant data structures referencing symbols from 
    auto-imported DLLs

5 个答案:

答案 0 :(得分:4)

编译没有任何问题,你有链接问题(更准确地说,只是警告)。参见:

d:\alqualos\pr\testpq>g++ -Wall -c main.cpp
main.cpp: In function 'int main()':
main.cpp:14:8: warning: unused variable 'obj'
d:\alqualos\pr\testpq>g++ -Wall main.o
Info: resolving vtable for __cxxabiv1::__si_class_type_info by linking to __imp_
__ZTVN10__cxxabiv120__si_class_type_infoE (auto-import)
Info: resolving vtable for __cxxabiv1::__class_type_info by linking to __imp___Z
TVN10__cxxabiv117__class_type_infoE (auto-import)
d:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: warning: a
uto-importing has been activated without --enable-auto-import specified on the c
ommand line.
This should work unless it involves constant data structures referencing symbols
 from auto-imported DLLs.

这是MinGW广泛使用的“功能”。如果您的程序需要标准C ++库中的任何内容,甚至只需要std :: cout,就会发生这种情况。在这种情况下,它与vtables有关。摆脱它:

d:\alqualos\pr\testpq>g++ -Wall -Wl,--enable-auto-import main.o

我不知道什么“应该工作,除非它涉及从自动导入的DLL引用符号的常量数据结构”的意思。我试过谷歌搜索但没有找到任何有用的东西。如果有人弄清楚它的真正含义以及什么时候可能有危险,请在这里发表答案。

答案 1 :(得分:1)

尝试A * obj = new B;,但是将来也请发布错误消息。

答案 2 :(得分:0)

您的帖子符合C ++标准的所有要求的代码。问题在于编译器,我试图在VS(Windows)和g ++(Linux)中编译它,并且在这两个编译中都成功了。

答案 3 :(得分:0)

我在另一台计算机上测试它并且它正常工作,所以我认为问题在于一台计算机上的编译器。

答案 4 :(得分:0)

只是一个猜测,但您是否尝试将虚拟析构函数添加到基类?也许这会有所帮助。