class A { public: A(); virtual ~A(); void f1(); virtual void f2(); virtual void f3()=0; }; class B : public A { public: B(); virtual ~B(); void f1(); virtual void f2(); virtual void f3(); }; int main() { A *m_j=new B(); m_j->f1(); m_j->f2(); m_j->f3(); delete m_j; return 0; }win32ConApp.obj : error LNK2001: unresolved external symbol "public: void __thiscall B::f1(void)" (?f1@B@@QAEXXZ)
win32ConApp.obj : error LNK2001: unresolved external symbol "public: __thiscall B::B(void)" (??0B@@QAE@XZ)
Debug/win32ConApp.exe : fatal error LNK1120: 2 unresolved externals
为什么?
都实现了就好了吧。
<preclass="brush:cpp;toolbar:true;auto-links:false;">#include<iostream>classA{public:A(){};virtual~A(){};voidf1(){std::cout<<"A::f1()\n";};virtualvoidf2(){std::cout<<"A::f2()\n";};virtualvoidf3()=0;};classB:publicA{public:B(){};virtual~B(){};voidf1(){std::cout<<"B::f1()\n";};virtualvoidf2(){std::cout<<"B::f2()\n";};virtualvoidf3(){std::cout<<"B::f3()\n";};};intmain(){A*m_j=newB();m_j->f1();m_j->f2();m_j->f3();deletem_j;return0;}运行结果:
<preclass="brush:shell;toolbar:true;auto-links:false;">A::f1()B::f2()B::f3()
错误的原因是下面这两个方法只提供了定义,而没有实现:
B::f1(void)
B::B(void)
()和(void)是不一样的哦~我猜你没有用virtual,把C++想成Java了。如果父类有写,子类可以不写virtual的。实现以下,分号;改括号{}就行了没有实现语法没有任何错误,但是下面使用的函数的时候,只提供了声明,但没有定义,才导致了链接时的错误编译器进行符号链接的时候,需要把特定的符号与函数执行体进行符号链接,然后你调用的时候,才能跳到特点的函数体进行操作,如果编译器发现没有函数体而只有声明,符号链接就无法将进行,这个时候就报链接错误,
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。