派生类和基类不在同一个命名空间下 派生类源文件已经包含了基类的头文件 基类没有构造函数 派生类有 编译时链接报错 /usr/lib/gcc-cross/arm-linux-gnueabihf/9/../../../../arm-linux-gnueabihf/bin/ld: ../../../lib/libPcslib.a(ModbusConnection.cpp.o): in function `cp::ModbusConnection::ModbusConnection(char const*, cp::Serial*, int, bool)': /home/zlgmcu/Desktop/monitor-s/src/Pcslib/ModbusConnection.cpp:51: undefined reference to `esf::Connection::~Connection()'
时间: 2023-08-05 18:03:09 浏览: 148
根据你提供的信息,编译时的链接错误指出在`ModbusConnection.cpp`文件中的`ModbusConnection`构造函数调用了基类`Connection`的析构函数,但是该析构函数在链接阶段找不到。
这个错误通常是因为在链接阶段找不到基类的析构函数的定义。这可能是因为基类的析构函数没有被实现或者没有正确链接基类所在的库文件。
要解决这个问题,你可以确保以下几点:
1. 确保基类`Connection`的头文件被正确包含在派生类`ModbusConnection`的源文件中。
2. 确保基类`Connection`的实现文件被正确地编译和链接到最终的可执行文件中。这可能涉及到在编译和链接命令中包含基类的源文件或库文件。
3. 确保基类`Connection`的析构函数在实现文件中有正确的定义和实现。
如果以上步骤都正确无误,但问题仍然存在,请检查编译和链接命令是否正确,尤其是库文件的链接是否正确。
如果问题仍然存在,可能需要更多的上下文信息或者代码来进一步分析和解决问题。
相关问题
4-1 设计一个基类和一个派生类,在基类和派生类中分别编写各自的构造函数和析构函数 并打印出调用的提示信息,同时可根据需要编写完成类共接口的函数如 Set 函数和 Get 函 数、显示函数等,使用初始化列表完成基类子对象的初始化。类拆分成两个文件,一个头 文件和一个 CPP 文件,并建立包含主程序的测试文件。建立工程并调试及运行结果(工程 两个头文件,三个 CPP 文件)。
这里提供一个示例代码,包括基类 Parent 和派生类 Child:
Parent.h:
```cpp
#pragma once
#include <iostream>
class Parent {
public:
Parent(int num);
virtual ~Parent();
virtual void display();
protected:
int m_num;
};
```
Parent.cpp:
```cpp
#include "Parent.h"
Parent::Parent(int num) : m_num(num) {
std::cout << "Parent constructor called!" << std::endl;
}
Parent::~Parent() {
std::cout << "Parent destructor called!" << std::endl;
}
void Parent::display() {
std::cout << "Parent display: " << m_num << std::endl;
}
```
Child.h:
```cpp
#pragma once
#include "Parent.h"
class Child : public Parent {
public:
Child(int num1, int num2);
~Child();
void display() override;
void setNum1(int num1);
int getNum1() const;
void setNum2(int num2);
int getNum2() const;
private:
int m_num1;
int m_num2;
};
```
Child.cpp:
```cpp
#include "Child.h"
Child::Child(int num1, int num2) : Parent(num1 + num2), m_num1(num1), m_num2(num2) {
std::cout << "Child constructor called!" << std::endl;
}
Child::~Child() {
std::cout << "Child destructor called!" << std::endl;
}
void Child::display() {
std::cout << "Child display: " << m_num1 << ", " << m_num2 << ", " << m_num << std::endl;
}
void Child::setNum1(int num1) {
m_num1 = num1;
}
int Child::getNum1() const {
return m_num1;
}
void Child::setNum2(int num2) {
m_num2 = num2;
}
int Child::getNum2() const {
return m_num2;
}
```
main.cpp:
```cpp
#include "Child.h"
int main() {
Child c(1, 2);
c.display();
c.setNum1(3);
c.setNum2(4);
c.display();
return 0;
}
```
运行结果:
```
Parent constructor called!
Child constructor called!
Child display: 1, 2, 3
Child display: 3, 4, 7
Child destructor called!
Parent destructor called!
```
书写第一段代码,定义一个名为CPerson的类,有以下私有成员:姓名、身份证号、性别和年龄,成员函数:构造函数、析构函数、输出信息的函数。 并在此基础上派生出CEmployee类,派生类CEmployee增加了两个新的数据成员,分别用于表示部门和薪水。 书写第二段代码,要求派生类CEmployee的构造函数显示调用基类CPerson的构造函数,并为派生类CEmployee定义析构函数,定义输出信息的函数。 要求用c++标准代码书写
第一段代码:
```cpp
#include <iostream>
#include <string>
using namespace std;
class CPerson {
private:
string name;
string id_card;
string gender;
int age;
public:
CPerson(const string& name, const string& id_card, const string& gender, int age) {
this->name = name;
this->id_card = id_card;
this->gender = gender;
this->age = age;
}
~CPerson() {
cout << "CPerson析构函数被调用" << endl;
}
void outputInfo() {
cout << "姓名:" << name << endl;
cout << "身份证号:" << id_card << endl;
cout << "性别:" << gender << endl;
cout << "年龄:" << age << endl;
}
};
class CEmployee : public CPerson {
private:
string department;
double salary;
public:
CEmployee(const string& name, const string& id_card, const string& gender, int age, const string& department, double salary)
: CPerson(name, id_card, gender, age) {
this->department = department;
this->salary = salary;
}
~CEmployee() {
cout << "CEmployee析构函数被调用" << endl;
}
void outputInfo() {
CPerson::outputInfo();
cout << "部门:" << department << endl;
cout << "薪水:" << salary << endl;
}
};
int main() {
CEmployee employee("John", "1234567890", "Male", 30, "HR", 5000);
employee.outputInfo();
return 0;
}
```
第二段代码要求构造函数显示调用基类的构造函数,C++默认会自动调用基类的构造函数,所以可以不用显示调用。析构函数会自动调用基类和派生类的析构函数,所以也不需要额外定义。
请注意,由于C++中没有内置的字符串类型,使用`string`需要包含`<string>`头文件,并使用`using namespace std;`来使用`string`。
阅读全文