c++ - 那么现在 struct 可以有虚函数并支持继承吗?那么与 classes 有什么区别呢?信息隐藏的真正目的是什么?

标签 c++ class inheritance struct information-hiding

<分区>

Possible Duplicate:
What are the differences between struct and class in C++

http://www.cplusplus.com/reference/std/typeinfo/type_info/

我想我的“老师”并没有告诉我很多关于 C++ 中结构和类之间的区别。

我在其他一些关于继承的问题中读到,默认情况下结构是公共(public)的...我也猜想结构没有构造函数/析构函数...

那么还有哪些区别呢?它们有那么重要吗?

当谈到私有(private)/ protected 属性/方法时,它们在运行时不可访问,只是因为编译器在编译时告诉它并报告错误,对吧?那么将这些特性与类进行比较,“信息隐藏”到底给程序员带来了什么?是不是这样当有人重用这个类时,这个人就不会滥用这个类,因为私有(private)/ protected 东西会被编译器报告?

我仍然在为信息隐藏的真正目的而苦苦挣扎,它仍然想在我的脑海中听起来像是它为程序带来了更多的安全性,意味着更少的安全漏洞,但我真的很困惑这种语言设计的目标...(而且我不打算以任何方式反对 C++,我只是想了解在什么情况下此功能可能有趣或不有趣;如果不是,那不是问题,但我只是想知道... ).

最佳答案

就编译器而言,除了默认的可访问性外,structclass 之间没有区别。它们只是定义同一事物的两个不同关键字。所以,结构可以有构造函数、析构函数、基类、虚函数等等。

就程序员而言,使用 struct 来处理没有这些东西的类(特别是 POD )是一个常见的约定,或者更进一步使用 struct 仅适用于根本没有用户定义的成员函数,只有公共(public)数据成员的类。人们有时会把这个约定搞砸,因为人们很容易认为一个类是 POD,但实际上不是,但至少他们在尝试。

至少在 C++ 中,信息隐藏与安全完全无关。把它从你的脑海中抹去。它不提供任何安全性,除了以相同的一般方式,任何良好的编码实践使代码更容易推理,因此程序员犯的错误更少。

信息隐藏的目的是允许您稍后更改实现,也许是删除或重命名私有(private)成员,安全地知道您的类的任何用户、类本身和 friend 之外的用户都不会引用他们.显然,这样做确实很有用,但不太明显,也许更重要的是,它很有用,因为它在代码中明确了你的类的接口(interface)是什么,你希望客户端使用,以及你的用户类可以理所当然地期望工作。原则上,您可以通过文档实现相同的目的,但在实践中,编译器强制执行规则是件好事。

它不是“安全的”,因为在任何给定的编译器上都可以绕过公共(public)/私有(private)保护。但是,如果您类(class)的用户这样做,他们就是在使用一些奇怪的 hack,当您更改类(class)时,他们的代码应该停止编译/工作,如果他们来找您提示,您可以 mock 他们。

关于c++ - 那么现在 struct 可以有虚函数并支持继承吗?那么与 classes 有什么区别呢?信息隐藏的真正目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3845564/

相关文章:

c++ - 数组作为函数参数查找数组长度时出错

c++ - 如何使用继承的方法和相同的基类方法?

java - @DiscriminatorColumn 的动态值

C++ Winapi 在 .exe 文件中包含 DLL

c++ - 为什么公共(public)重载与某些编译器上的私有(private) using 指令冲突?

java - 通用对象创建方法的返回类型

c++ - 即使已经包含了类的标题,也被迫使用前向声明

c++ - 为什么叫动态绑定(bind)呢?

c++ - 我正在尝试加载模型但未显示

c++ - 没有调用复制构造函数?