开发者社区> 问答> 正文

C++这样也报错,vc6.0环境。?报错

  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
为什么?

展开
收起
爱吃鱼的程序员 2020-06-22 18:48:15 392 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    都实现了就好了吧。
    <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的。实现以下,分号;改括号{}就行了没有实现语法没有任何错误,但是下面使用的函数的时候,只提供了声明,但没有定义,才导致了链接时的错误

    编译器进行符号链接的时候,需要把特定的符号与函数执行体进行符号链接,然后你调用的时候,才能跳到特点的函数体进行操作,如果编译器发现没有函数体而只有声明,符号链接就无法将进行,这个时候就报链接错误,

    2020-06-22 18:48:32
    赞同 展开评论 打赏
问答分类:
C++
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载