我在程序中使用虚拟功能时获得了LNK2005、LNK2001和LNK1120

I am getting LNK2005, LNK2001 and LNK1120 while using virtual function in my Program

提问人:Anirudh Kanaparthy 提问时间:2/28/2022 更新时间:2/28/2022 访问量:99

问:

我是初学者,所以这个问题对你来说可能微不足道。 所以我有以下文件:

  • 基数.h
  • 派生.h
  • 基数 .cpp
  • 派生的 .cpp
  • 测试Cpp.cpp

基数.h

#include <iostream>

namespace App
{
    class Base
    {
    public:
        virtual void Print();
    };
}

基数 .cpp

#include "base.h"

namespace App
{
}

派生.h

#include "base.h"

class Derived : public App::Base
{
public:
    void Print();
};

派生的 .cpp

#include "derived.h"

void Derived::Print()
{
    std::cout << "This works!! form Derived class\n";
}

最后是TestCpp.cpp

#include "derived.h"

int main()
{
    std::cout << "Hello World!\n";
    Derived d;
    d.Print();
    return 0;
}

我收到以下链接器错误:enter image description here

我不知道我做错了什么。请帮帮我。

C++ OOP 命名空间 LNK2005

评论

0赞 Adrian Mole 2/28/2022
你已经清楚地意识到你需要提供一个实际的定义,那么是什么让你认为事情是不同的呢?Derived::Print()Base::Print()
0赞 user17732522 2/28/2022
您需要添加 in 的定义,或者通过编写来使其成为纯虚拟的。virtual void Print();Basevirtual void Print() = 0;
1赞 user17732522 2/28/2022
这回答了你的问题吗?什么是未定义的引用/未解析的外部符号错误,我该如何解决它?,特别是这个答案
0赞 Anirudh Kanaparthy 2/28/2022
@user17732522确实奏效了。我想如果你使用关键字“virtual”,你必须跳过基类中的定义。
0赞 user17732522 2/28/2022
@AnirudhKanaparthy 纯虚函数不需要定义,但只是函数需要定义,因为您仍然可以直接创建对象并调用它。那么应该调用哪个函数定义呢?如果将其设置为纯虚拟类,则该类将变成一个抽象类,只能为其创建派生实例,因此不再需要定义。Base.Print()

答:

0赞 The Coding Fox 2/28/2022 #1

只需在文件中添加一个定义:Print()base.cpp

namespace App
{
    void Base::Print() { }
}

它可能里面没有任何东西,但它应该在那里。

或者通过使其纯化来指示要在派生类中定义:Print()

virtual void Print() = 0;

2 个选项中的任何一个都可以。同样在你的派生类中,最好是:(点击这里知道为什么Print()override)

class Derived : public App::Base
{
public:
    void Print() override;
};
1赞 user12002570 2/28/2022 #2

问题在于,您只在类中声明了虚函数,而没有定义它。PrintBase

C++03 标准: 10.3 虚拟函数 [class.virtual]

在类中声明的虚函数应在该类中定义或声明为纯 (10.4),或两者兼而有之;但不需要诊断 (3.2)。

因此,解决这个问题的方法是在类中实现/定义成员函数,或者通过将声明替换为 inside 类来使其成为纯虚拟函数virtualPrintBasevirtual void Print() = 0;Base

解决方案 1

基数 .cpp

#include "base.h"

namespace App
{
    void Base::Print()
    {
        
    }
}

解决方案 1:演示

解决方案 2

基数.h

#include <iostream>

namespace App
{
    class Base
    {
    public:
        virtual void Print() = 0;
    };
}

解决方案 2:演示