我正在阅读C#中的sealed关键字。我记不起上次从标准库继承了。在c ++中我记得继承了一个std接口,它键入了几个类型并使用了我的一些参数。但那是1)琐碎的2)界面

从我的头脑中,我不记得我继承的任何类都没有预期要继承的虚函数。任何人都可以告诉我你需要继承一个不是一个接口的非平凡类吗?

我甚至可以说,除非它具有虚函数,否则不要继承类是一个很好的规则。这是一个很好的经验法则吗?

注意:我使用运算符SomeClass& SomeClass(){return m_someClass;在这种情况下,我需要将我的对象作为另一个类传递。效果很好。

有帮助吗?

解决方案

它实际上是在C ++中使用的,因为所有这些都不是一种继承(例如继承一个实现,mixins,boost :: noncopyable,你继承它并使你的类不可复制,boost ::运算符你从某个类继承的地方,它会给你的类添加一些运算符)。此外,在使用C ++类型进行元编程时,从其他类型继承是组成类型的最简单方法之一。

另一种情况,你从没有虚函数的类继承,但用作“种类”的类。一个接口,是静态多态(像CRTP这样的技术,其中类ConcreteA:BaseA)。它们不需要虚函数,因为所有内容都在编译时解析。

但是,如果你想以多态方式处理你的类运行时,你应该至少使一个方法虚拟,那就是析构函数。有例外,但很少见。

即使您拥有多态层次结构,有时也会从具体类派生出来。一个例子是从TextEdit派生的SingleLineEdit。但是,这有点危险,因为它打破了父类的封装(例如,它的方法可能需要一些实现细节,你必须尊重并保留它们在子类中 - 这可能很棘手,因为它们是可能的实现细节在下一个版本中更改,恕不另行通知。)

其他提示

我认为面向对象编程的关键概念是多态。如果继承自特定类不允许您利用多态性,那么继承的重点是什么?因此,如果没有要覆盖的方法,那么不要进行子类化。您只会增加代码的复杂性。如果你想要很多相同的功能,只需将现有的类包装在你自己的类中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top