C++中C2084错误:‘函数已存在函数体’问题求助
解决C++继承中C2084“函数已存在函数体”错误
你遇到的C2084错误,核心原因是同一个函数在头文件和源文件中重复定义了函数体。在Employee.h和Manager.h里,你给虚函数displayDetails()写了空函数体{},这已经算是完成了函数定义;但在对应的.cpp文件里又重新编写了函数实现,直接导致了重复定义冲突。
下面是修正后的代码:
修正后的头文件
Employee.h
#pragma once #include<string> class Employee { public: std::string name{}; int salary{}; Employee(std::string name, int salary); // 仅做函数声明,不写函数体 virtual void displayDetails(); };
Manager.h
#pragma once #include<string> #include "Employee.h" class Manager : public Employee { private: std::string department{}; public: Manager(std::string name, int salary, std::string department); // 仅做声明,不写函数体 void displayDetails() override; };
源文件保持不变(已为正确实现)
Employee.cpp
#include<iostream> #include "Employee.h" #include<string> Employee::Employee(std::string name, int salary) : name(name), salary(salary) {} void Employee::displayDetails() { std::cout << "Name: " << name << std::endl; std::cout << "Salary: " << salary << std::endl; }
Manager.cpp
#include<iostream> #include<string> #include "Manager.h" Manager::Manager(std::string name, int salary, std::string department) : Employee(name, salary), department(department) {}; void Manager::displayDetails(){ std::cout << "Name: " << name << std::endl; std::cout << "Salary: " << salary << std::endl; std::cout << "Department: " << department << std::endl; }
Main.cpp
#include "Employee.h" #include "Manager.h" #include<string> int main() { Employee e1("Robert", 5000); Employee e2("Sam", 8000); e1.displayDetails(); e2.displayDetails(); Manager m("Ben", 15000, "Marketing"); m.displayDetails(); return 0; }
补充说明:虚函数的声明与实现分离是C++的常规写法,头文件仅声明函数签名(告诉编译器函数的存在),具体逻辑放在源文件中实现。如果在头文件里写{},相当于把函数实现放在了头文件中,后续多个源文件包含该头文件时,还可能引发其他重复定义类的错误。
内容的提问来源于stack exchange,提问作者Sampath P
相关产品推荐
相关产品推荐

