首页 > 编程语言 >C++中类和结构体的互相继承

C++中类和结构体的互相继承

时间:2024-11-08 22:41:45浏览次数:3  
标签:函数 继承 成员 MyStruct C++ public 中类 struct

在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 一样定义方法,使得结构体不仅限于数据存储,还可以具备逻辑操作功能。

标签:函数,继承,成员,MyStruct,C++,public,中类,struct
From: https://www.cnblogs.com/chentiao/p/18536068

相关文章

  • C++之fixed
    在C++中,fixed是一个操纵符(manipulator),用于指定浮点数的显示格式。在默认情况下,C++会使用科学计数法或定点(小数点)格式输出浮点数,具体取决于数值的大小和有效位数。然而,当使用fixed时,它会强制所有浮点数都以定点格式显示,即以小数点后的固定位数输出,不使用科学计数法。fixed......
  • C++模板真的没有教材讲的呢么简单
            模板和泛型编程息息相关,但是大多数人对模板的了解可能只是教材上的一个compare函数,但实际上模板的内容很丰富,学起来也比较抽象,我会结合我所了解的一部分模板内容进行解释。    本文内容参考《C++Primer》目录定义模板模板实参推演可变参数模板......
  • C++——求a!+b!+c!的值,用一个函数fac(n)求n!。a,b,c的值由主函数输入,最终得到的值在主
    没注释的源代码#include<iostream>usingnamespacestd;intfun(intn);intmain(){   inta,b,c,sum;   cout<<"pleaseinputa,b,c:";   cin>>a>>b>>c;   sum=fun(a)+fun(b)+fun(c);   cout<<"a!+b!+c!="......
  • C++——求一个3*3矩阵主对角线元素之和。
    没注释的源代码#include<iostream>usingnamespacestd;intmain(){   inta[3][3],sum=0;   cout<<"pleaseinputmartix:"<<endl;   for(inti=0;i<3;i++)   {       for(intj=0;j<3;j++)       {           cin......
  • C++——分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新
    要求:(1)在两个基类中都包含姓名年龄性别地址电话等数据成员。(2)在Teacher类中还包含数据成员tile职称),在Cadre类中还包含数据成员POst(职务)。在Teacher.Cadre类中还包含数据成员wages(工资)。(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在......
  • C++ 函数对象、函数指针与Lambda表达式
    C++函数对象、函数指针与Lambda表达式函数指针函数指针(FunctionPointer)是指向函数的指针变量。它可以存储函数的地址,并通过该指针变量来调用该函数。函数指针的声明使用指针符号,指向的类型为函数的返回类型和参数列表,如int(funcPtr)(int,int);。函数指针的值可以指向相同......
  • 08C++选择结构(2)——教学
    一、逻辑变量教学视频存储类似灯亮或灯灭、是男还是女等结果只有两种可能的数据时,可以使用逻辑型变量。逻辑型变量用关键字bool定义,所以又称为布尔变量,其值只有两个false(假)和true(真),false和true是逻辑常量,又称布尔常量。流程图如下:英汉小词典:bool:布尔false:假true:真二、逻......
  • C++ 可变参数模板递归展开
    #include<iostream>usingnamespacestd;template<typenameHead,typename...Tail>doubleMax(Headfirst,Tail...rest){doubleMaxnum=0;Maxnum=Max(rest...);if(Maxnum<first)Maxnum=first;returnMaxnum;}......
  • 【QT项目】QT6项目之基于C++的通讯录管理系统(联系人/学生管理系统)
    目录一.项目背景二.创建工程工程创建添加文件 联系人类 功能类三.功能实现联系人类person.cppperson.h 查查询按钮槽函数返回按钮槽函数findperson.cpp:增addperson.cpp:删deleteperson.cpp:改changeperson.cpp:!!显示!!displayperson.cpp:清除clearp......
  • C++ 模板实参推断和引用折叠
    两个例外规则假定i是一个int对象,我们可能认为像£3(i)这样的调用是不合法的。毕竟,i是一个左值,而通常我们不能将一个右值引用绑定到一个左值上。但是,C++语言在正常绑定规则之外定义了两个例外规则,允许这种绑定。这两个例外规则是move这种标准库设施正确工作的基础。第一个例......