所以现在结构体可以拥有虚函数并支持继承?那么与类有什么区别呢?信息隐藏的真正目的是什么?

12 浏览
0 Comments

所以现在结构体可以拥有虚函数并支持继承?那么与类有什么区别呢?信息隐藏的真正目的是什么?

我猜我的“老师”并没有告诉我很多关于C++中struct和class之间的区别。我在其他问题中读到,关于继承方面,struct默认是公共的...我还猜struct没有构造函数/析构函数...那么其他的区别是什么呢?它们很重要吗?当谈到私有/受保护的属性/方法时,它们在运行时是不可访问的,只是因为编译器在编译时告诉它们并报告错误,对吗?那么将这些特性与类进行比较,\"信息隐藏\"对程序员到底有什么好处?这样做是为了当别人重用类时,这个人不会因为编译器报告私有/受保护的内容而滥用类吗?我仍然在努力理解信息隐藏的真正目的,它在我的脑海中仍然希望听起来能够增加程序的安全性,减少安全漏洞,但我对语言中这种设计的目标感到困惑...(我并不打算反对C++,我只是想了解在哪些情况下这个特性可能有趣或无趣;如果无趣,那也没有问题,但我只是想知道...)。

0
0 Comments

struct和class在编译器的角度来看没有任何区别,除了默认的可访问性。它们只是定义相同事物的两个不同关键字。所以,struct可以有构造函数、析构函数、基类、虚函数等等。

然而,在程序员看来,使用struct来定义那些没有构造函数、析构函数、基类和虚函数的类是一种常见的约定(具体来说是POD类型),或者更进一步地,只用struct来定义那些没有用户定义成员函数,只有公共数据成员的类。人们有时会犯这种约定的错误,因为很容易认为一个类是POD类型,但至少他们是在尝试。

在C++中,信息隐藏与安全性没有任何关系。请将安全性从你的思维中排除。除了与任何良好的编码实践一样,使代码更容易推理和减少程序员的错误之外,它并不提供任何安全性。

信息隐藏的目的是允许你稍后更改实现,例如删除或重命名私有成员,并确保类的用户(类本身和友元除外)没有引用它们。显然,这样做很有用,但不太明显,也许更重要的是,它使代码中明确了你的类的接口是什么,你希望客户端使用的接口,以及你的类的用户可以合理地期望的接口。你可以通过文档原则上实现同样的目标,但在实践中,编译器强制执行规则是很好的。

它并不是“安全”的,因为在任何给定的编译器上都可以绕过public/private的保护。但是,如果类的用户这样做,他们使用了一些丑陋的技巧,他们的代码在你更改类时停止编译/工作,如果他们向你抱怨,你可以嘲笑他们。

这些优势非常小...我仍然不明白继承的目的,当你可以在其内部生成另一个类的对象时...面向对象编程真的是我的编程噩梦...当考虑代码速度和内存占用时,我仍然无法真正知道它的目的,除了使源代码更“现实友好”...

你没有问到继承的目的,那是一个与信息隐藏目的完全不同的问题。我建议你不要过多考虑代码速度和内存占用。我的电脑的速度和内存大约是我通常所需的10-100倍,所以我可以在性能上做很多事情来换取更容易使用的源代码。在速度或内存使用在危险区域的情况下,你需要花费很多时间来考虑它。其余的时间只需避免完全不适当的算法和结构即可。

对于游戏编程来说,速度是一种至关重要的问题...也许我还没有达到使用大量CPU的游戏的水平,但我会考虑到这一点...

我指的是struct a; struct b { a A; }; 这里的对象在内部,而我也可以做struct b : public a {};只需从a继承...我两者都可以做,但是我找不到任何优势...

具有讽刺意味的是,许多高性能游戏在lua中编写了大量代码,它是一种面向对象的脚本语言,通常在游戏中以解释器运行。对于那些需要高性能的特殊情况(物理引擎、图形处理),他们会切换到C++,或者切换到我不理解的诸如着色器管道之类的GPU技术。

关于继承和嵌入的问题,主要区别在于你是否希望类型为b的对象实际上是a所代表的任何东西,或者你只希望它们拥有/使用一个类型为a的对象。例如,如果a是std::fstream,则你的类b是一种特定类型的文件流(继承),还是它只是具有用于某些目的的文件流(嵌入)?

你不应该强制转换对象指针。如果你这样做了,你就没有正确地使用多态。

怎么没那样?在使用多态时,你怎么不转换?

0