Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 那么现在struct可以有虚函数并支持继承了吗?那么上课有什么区别呢?信息隐藏的真正目的是什么?_C++_Class_Inheritance_Struct_Information Hiding - Fatal编程技术网

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

C++ 那么现在struct可以有虚函数并支持继承了吗?那么上课有什么区别呢?信息隐藏的真正目的是什么?,c++,class,inheritance,struct,information-hiding,C++,Class,Inheritance,Struct,Information Hiding,可能重复: 我猜我的“老师”并没有告诉我很多关于C++中结构和类之间的区别。 我在其他一些问题中读到,关于继承,struct默认是公共的。。。我也猜struct没有构造函数/析构函数 那么,还有什么区别呢?它们有那么重要吗 当谈到私有/受保护的属性/方法时,它们在运行时是不可访问的,只是因为编译器在编译时告诉它并报告错误,对吗?然后将这些特性与类进行比较,“信息隐藏”到底给程序员带来了什么?这里是不是为了当有人重用这个类时,这个人不会误用这个类,因为私有/受保护的内容将由编译器报告 我仍然在

可能重复:

我猜我的“老师”并没有告诉我很多关于C++中结构和类之间的区别。 我在其他一些问题中读到,关于继承,struct默认是公共的。。。我也猜struct没有构造函数/析构函数

那么,还有什么区别呢?它们有那么重要吗

当谈到私有/受保护的属性/方法时,它们在运行时是不可访问的,只是因为编译器在编译时告诉它并报告错误,对吗?然后将这些特性与类进行比较,“信息隐藏”到底给程序员带来了什么?这里是不是为了当有人重用这个类时,这个人不会误用这个类,因为私有/受保护的内容将由编译器报告


我仍然在与信息隐藏的真正目的作斗争,它仍然想在我的脑海中听起来像它在程序中带来了更多的安全性,意味着更少的安全漏洞,但我真的很困惑这种语言设计的目标。。。(我不打算用任何方式反对C++,我只是想了解在什么情况下这个特性是有趣的或不好的;如果不是,那不是问题,但我只是想知道……)< /P> < P>。对于编译器而言,除了默认的可访问性之外,<代码>结构> <代码>和<代码>类< /代码>之间没有区别。它们只是定义同一事物的两个不同关键字。因此,结构可以有构造函数、析构函数、基类、虚函数等等

就程序员而言,一个常见的惯例是对没有这些东西的类(特别是那些)使用
struct
,或者更进一步,只对没有用户定义成员函数的类使用
struct
,只对公共数据成员使用。人们有时会把这个惯例搞砸,因为当一个类不是POD时,人们很容易认为它是POD,但至少他们在努力

<>在C++中,至少信息隐藏与安全无关。把那件事忘掉。它不提供任何安全性,除非任何良好的编码实践都使代码更容易推理,因此程序员犯的错误更少

信息隐藏的目的是允许您在以后更改实现,可能是删除或重命名私有成员,因为您知道您的类的所有用户(除了类本身和朋友)都没有引用他们。显然,这样做很有用,但不太明显,也许更重要的是,这样做很有用,因为它在代码中明确了类的接口是什么,您希望客户端使用什么,以及您的类的用户可以正确地期望工作什么。原则上,您可以通过文档实现相同的功能,但实际上,编译器可以强制执行这些规则


它不是“安全的”,因为在任何给定的编译器上,它都可以绕过公共/私有保护。但是如果你的类的用户这样做了,他们使用的是一些奇怪的黑客,当你改变你的类时,他们的代码应该停止编译/工作,如果他们来投诉你,你可以嘲笑他们。

你的另一个问题可能是和的重复。顺便说一句,请尽量在每篇文章中问一个问题。这听起来像是两个独立的问题。分别问他们(或者阅读他们重复的问题)第三个难题:你可以创建类和结构的联合体(只要它们没有ctor/dtor,但联合体可以有ctor)。@Steve:回答得好。+1
:)
这些都是很小的优势。。。我仍然不明白继承的目的是什么,当你可以从它里面的另一个类中产生一个对象时。。。OOP真是我的编程噩梦。。。当考虑代码速度和内存占用时,我仍然不知道目的是什么,除了使源代码更加“现实友好”…@gokoon:你没有问继承的目的,这是信息隐藏的另一个问题。不过,我建议您不要过多考虑代码速度和内存占用。我的电脑的速度和内存大约是我通常需要的10-100倍,所以我可以用更容易使用的源代码作为回报。在不寻常的情况下,速度或内存使用在危险区的10倍以内,这就是你花大量时间思考的时候。剩下的时间只是避免完全不合适的算法和结构。@gokoon:关于interitance和embedding,主要区别在于您是否希望
b
类型的对象实际上是
a
所代表的对象,或者您只是希望它们拥有/使用
a
类型的对象。例如,如果
a
std::fstream
,那么您的类
b
是一种特定类型的文件流(继承),还是只是它有一个用于某种目的的文件流(嵌入)?嗯,幽默的不协调。虽然你担心C++的开销,但其他游戏程序员正在抨击大量的代码,它们远不如运行时效率高。事实上,他们这样做的原因是,熟练的开发人员可以将时间集中在优化少数重要的方面,而不是分散精力,担心整个代码库。即使是单独开发人员也应该这样做:大多数代码不需要优化。