【问题标题】:"Error: Unresolved external symbol" whenever I use a pure virtual function每当我使用纯虚函数时出现“错误:未解析的外部符号”
【发布时间】:2013-01-17 13:53:45
【问题描述】:

我觉得我在做一些非常愚蠢的事情,但我根本无法弄清楚我的代码有什么问题。我什至做了一个超级简化版的代码,仍然出现错误:

#include <iostream>

using namespace std;

class c1{
public:
    c1(){}
    ~c1(){}

    virtual int add(int a, int b);

private:
protected:


};

class c2 : c1{
public:
    c2(){}
    ~c2(){}

    int add(int a, int b){
        return a+b;
    }

};

int main(){

    c2 c;
    c.add(5,6);

}

谁能发现我确信是有史以来最愚蠢的错误?

这是确切的错误消息:

1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall c1::add(int,int)" (?add@c1@@UAEHHH@Z)

【问题讨论】:

    标签: c++ class inheritance virtual-functions


    【解决方案1】:
    virtual int add(int a, int b);
    

    这不是纯虚函数的声明。它只是一个虚函数的声明。它缺少定义,这就是您收到错误的原因。

    virtual int add(int a, int b) = 0;
    

    这是一个纯虚函数的声明。它不需要定义,这就是为什么不会得到错误。

    【讨论】:

      【解决方案2】:

      您收到链接器错误,因为 c1::add(int,int) 未实现。 要么把它变成纯虚拟的,要么实现它。

      【讨论】:

        【解决方案3】:

        c1::add() 不是纯虚拟的,只是没有实现。这意味着链接器正确地寻找主体,并且正确地在找不到主体时抱怨。你可能是这个意思:

        class c1{
        public:
            c1(){}
            ~c1(){}
        
            virtual int add(int a, int b) = 0;  // adding = 0 makes the function pure virtual
        
        private:
        protected:
        
        
        };
        

        【讨论】:

          【解决方案4】:

          change virtual int add(int a, int b); 到 虚拟 int add(int a, int b) = 0;

          【讨论】:

            【解决方案5】:

            virtual int add(int a, int b); 这意味着“我的函数add 可以被子类化”。在其他是“我的函数add 可以被子类化并且是纯虚拟的”你需要

            virtual int add(int a, int b) = 0;
            

            【讨论】:

              【解决方案6】:

              c1.add 不是纯虚,必须加上= 0

              virtual int add(int a, int b) = 0; 
              

              【讨论】:

              • 他没有理由不得不使用公共继承,除非他想将指向c2 的指针向下转换为c1*,他没有这样做他的榜样。他仍然可以从他的 main 调用 c2::add,因为它是一个公共函数。
              • 不客气。我很高兴看到你这么快就修好了。 :)
              猜你喜欢
              • 2012-05-22
              • 2020-02-11
              • 2015-11-17
              • 2013-02-22
              • 2013-06-20
              • 2019-08-28
              • 2015-10-11
              • 2012-10-17
              • 2020-08-23
              相关资源
              最近更新 更多