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;
}

解释

  1. 普通成员函数introduce() 是一个普通的成员函数,可以访问 struct 中的成员变量。
  2. 静态成员函数showInfo() 是一个静态成员函数,不需要实例化即可调用。
  3. 虚函数greet() 是一个虚函数,可以在子类中重写,并在多态调用中起作用。

总结
在 C++ 中,struct 可以像 class 一样定义方法,使得结构体不仅限于数据存储,还可以具备逻辑操作功能。

posted @   海_纳百川  阅读(306)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 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强势使用方法
本站总访问量8979580
 
点击右上角即可分享
微信分享提示