cpp的类与结构体有什么区别?

在C++中,结构体(struct)和类(class)在语法上非常相似,它们都可以封装多个数据成员和成员函数。但是,它们之间还是存在一些区别:

  1. 默认访问权限:在类中,成员默认的访问权限是private,而在结构体中,成员默认的访问权限是public。
  2. 构造函数和析构函数:类可以定义构造函数、析构函数和其他成员函数,而结构体只能定义数据成员,不能定义函数。
  3. 继承:类支持继承,可以使用继承来创建子类和父类,而结构体不支持继承。
  4. 成员函数:类中可以定义成员函数,而结构体中不能定义成员函数。
  5. 命名空间:类名可以放在命名空间中,而结构体名不能放在命名空间中。

总的来说,结构体和类在语法上是相似的,但类具有更多的功能和灵活性,而结构体则更简单、更直接。选择使用结构体还是类取决于具体的需求和设计。

二、如何利用结构体实现一个类呢?

首先,定义一个基类(父类)的结构体:

typedef struct {  
    int base_value;  
} Base;

然后,定义一个派生类(子类)的结构体,它包含一个基类的结构体:

typedef struct {  
    Base base;  
    int derived_value;  
} Derived;
// 接下来,定义一个函数指针类型,用于模拟虚函数:

typedef int (*Func)(void);
// 然后,为基类定义一个虚函数表:

Func base_vtable[1] = { NULL };
// 接下来,为派生类定义一个虚函数表,它包含一个基类的虚函数表:

Func derived_vtable[2] = { base_vtable[0], NULL };
// 然后,为基类定义一个构造函数,它用于初始化虚函数表:

int Base_init(Base* base) {  
    base_vtable[0] = &Base_display;  
    return 0;  
}
// 接下来,为基类定义一个虚函数,用于显示基类的值:

int Base_display(void) {  
    return base_value;  
}
// 然后,为派生类定义一个构造函数,它用于初始化虚函数表和派生类的值:

int Derived_init(Derived* derived) {  
    base_vtable[0] = &Base_display;  
    derived_vtable[1] = &Derived_display;  
    derived->derived_value = 42;  
    return 0;  
}
// 接下来,为派生类定义一个虚函数,用于显示派生类的值:

int Derived_display(void) {  
    Derived* derived = (Derived*)derived_vtable;  
    return derived->derived_value;  
}
// 最后,创建一个派生类的实例,并调用它的虚函数:

Derived derived;  
Derived_init(&derived);  
printf("%d\n", derived_vtable[0]());  // 输出 42,因为 Derived_display 被调用。
//以上代码通过使用结构体和函数指针来模拟类的继承和多态功能。请注意,这只是一个简单的示例,实际应用中可能需要更复杂的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值