我在读C#中的sealed关键字。我不记得我最后一次继承标准库是什么时候了。在c++中,我记得继承了一个std接口,它定义了一些类型,并使用了我的一些参数。但那只是一个微不足道的接口
从我的脑海中,我不记得我继承的任何类都没有期望被继承的虚函数。谁能告诉我在什么情况下你需要继承一个不是接口的非平凡类?
我甚至可以说,最好不要继承一个类,除非它有虚函数。这是一个好的经验法则吗?
注意:在需要将对象作为另一个类传递的情况下,我使用操作符SomeClass& SomeClass() { return m_someClass;}。它工作得很好。
发布于 2009-03-02 00:00:12
它实际上是在C++中使用的,因为所有这些不是一种继承(例如,继承一个实现,mixins,boost::noncopyable,你从它继承并使你的类不可复制,boost::operators,你从某个类继承,它会向你的类添加一些运算符)。此外,在使用C++类型进行元编程时,从另一个类型继承是组成类型的最简单方法之一。
另一种情况是,继承自没有虚函数但充当“某种”接口的类的情况是静态多态性(像CRTP这样的技术,其中类ConcreteA : BaseA)。它们不需要虚函数,因为一切都是在编译时解决的。
然而,如果你想以多态的方式对待你的类,你真的应该至少有一个方法是虚的,那就是析构函数。也有例外,但很少见。
即使你有一个多态的层次结构,你有时也会从具体的类派生出来。一个例子是从TextEdit派生的SingleLineEdit。然而,这有点危险,因为它破坏了父类的封装(例如。它的方法可能需要一些实现细节,您必须在子类中尊重并保留它们-这可能很棘手,因为它们是实现细节,在下一个版本中可能会在没有通知的情况下更改,等等。)
发布于 2009-03-01 23:47:09
我认为面向对象编程的关键概念是多态性。如果从特定类继承不允许利用多态性,那么继承又有什么意义呢?因此,如果没有要重写的方法,那么就不要子类化。这只会增加代码的复杂性。如果您想要大量相同的功能,只需将现有类包装在您自己的类中即可。
https://stackoverflow.com/questions/600839
复制相似问题