C++中类和结构体的互相继承
在C++中,struct可以继承类,反之,类也可以继承struct。struct和类的唯一区别在于访问级别,默认情况下,struct的成员是public,而类的成员是private。
以下是一个简单的例子:
class BaseClass {
public:
void BaseFunction() {
std::cout << "Function in BaseClass" << std::endl;
}
};
struct DerivedStruct : public BaseClass {
void DerivedFunction() {
std::cout << "Function in DerivedStruct" << std::endl;
}
};
int main() {
DerivedStruct ds;
ds.BaseFunction(); // 调用基类中的函数
ds.DerivedFunction(); // 调用派生类中的函数
return 0;
}
在这个例子中,DerivedStruct 继承自 BaseClass,继承方式为public,这意味着BaseClass中的所有公有成员对DerivedStruct也是可见的。在main函数中,我们创建了一个DerivedStruct对象,并且成功地调用了它继承自BaseClass的BaseFunction函数和它自己的DerivedFunction函数。
在C++中,类可以通过继承机制继承自结构体或其他类,但是这通常不是推荐的做法,因为类和结构体在C++中基本上被视为相同的东西,只是默认的访问权限不同(类是私有,结构体是公有)。
不过,C++标准允许你通过使用struct关键字来定义结构体,并且允许在结构体中添加函数,这样结构体就可以像类一样工作了。
下面是一个示例代码,展示了如何在C++中使用结构体来模拟类的功能:
struct MyStruct {
void Function() {
// 结构体中的函数实现
}
int dataMember;
};
int main() {
MyStruct s;
s.Function();
s.dataMember = 10;
return 0;
}
在这个例子中,MyStruct结构体模拟了一个类,它有一个成员函数Function和一个成员变量dataMember。在main函数中,我们创建了一个MyStruct的实例,并调用了它的成员函数和访问了它的成员变量。
虽然从语法上可以这样做,但是在实际应用中,我们通常会遵循C++的传统,使用class关键字来定义类,并在类中使用public、protected和private来控制成员的访问权限。
在C++中,类可以从结构体继承,就像从其他类继承一样。这里是一个简单的例子:
struct MyStruct {
int member1;
float member2;
};
class MyClass : public MyStruct {
public:
void Display() const {
std::cout << "member1: " << member1 << ", member2: " << member2 << std::endl;
}
};
int main() {
MyClass obj;
obj.member1 = 10;
obj.member2 = 3.14f;
obj.Display();
return 0;
}
在这个例子中,MyClass 类从 MyStruct 结构体继承了成员。MyClass 中可以添加额外的成员函数,如 Display(),它允许访问和显示从 MyStruct 继承来的成员。
可以的,C++ 允许在结构体(struct
)中定义方法(成员函数)。在 C++ 中,struct
和 class
的主要区别在于默认的访问控制权限不同:struct
中的成员默认是 public 的,而 class
中的成员默认是 private 的。除此之外,它们的功能几乎相同。
因此,你可以像在 class
中一样,在 struct
中定义构造函数、析构函数、普通成员函数、虚函数、静态函数等。
示例
#include <iostream>
#include <string>
struct Person {
std::string name;
int age;
// 构造函数
Person(const std::string &n, int a) : name(n), age(a) {}
// 普通成员函数
void introduce() const {
std::cout << "Hi, I'm " << name << " and I'm " << age << " years old." << std::endl;
}
// 静态成员函数
static void showInfo() {
std::cout << "This is a Person struct." << std::endl;
}
// 虚函数
virtual void greet() const {
std::cout << "Hello from Person!" << std::endl;
}
};
struct Student : public Person {
int grade;
// 构造函数
Student(const std::string &n, int a, int g) : Person(n, a), grade(g) {}
// 重写 greet 方法
void greet() const override {
std::cout << "Hello from Student!" << std::endl;
}
};
int main() {
Person p("Alice", 30);
p.introduce(); // 调用普通成员函数
Person::showInfo(); // 调用静态成员函数
Student s("Bob", 20, 10);
s.introduce(); // 继承的 introduce 方法
s.greet(); // 调用重写的 greet 方法
return 0;
}
解释
- 普通成员函数:
introduce()
是一个普通的成员函数,可以访问struct
中的成员变量。 - 静态成员函数:
showInfo()
是一个静态成员函数,不需要实例化即可调用。 - 虚函数:
greet()
是一个虚函数,可以在子类中重写,并在多态调用中起作用。
总结:
在 C++ 中,struct
可以像 class
一样定义方法,使得结构体不仅限于数据存储,还可以具备逻辑操作功能。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18536068,如有侵权联系删除
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2023-11-08 OpenCV透视变换-不对原图裁剪
2023-11-08 使用pillow对图像进行旋转和添加高斯白噪声
2022-11-08 IOU计算-纯python
2022-11-08 awk强势使用方法