抽象基类没有多态性

时间:2011-06-06 17:47:36

标签: c++ inheritance interface polymorphism

为什么你会有一个抽象基类定义一个只有一个(永远和永远)派生类的库的接口?

6 个答案:

答案 0 :(得分:4)

您可能想要替换单元测试

之类的实现

答案 1 :(得分:3)

为什么要这样做的一个原因是可测试性。当依赖对象被定义为接口时,测试依赖对象要简单得多。这样就可以轻松地模拟或存根。

答案 2 :(得分:2)

违反reused abstraction principle

简而言之,不要这样做。

那些说“进行测试”的人忽略了你可以直接替换

Base < - > Derived
Base < - > DerivedForMockingAndTesting

Derived < - > DerivedForMockingAndTesting    

也就是说,让您现有的实现Derived充当在单元测试中被模拟和测试的“抽象”。

答案 3 :(得分:1)

如果您可以100%确定始终只有一个且只有一个派生类?没有多大理由。但是:实际上你几乎不会100%肯定任何事情,肯定不是你代码的未来。

答案 4 :(得分:1)

您可能会发现该类的不同版本需要二进制兼容。您可能还会发现,由于其他原因,您希望封装类的定义 - 例如,因为定义需要一个包含宏较差的标头,以及包含定义类所需内容的标头很长的编译时间。

例如,我编写了一个类来封装我的操作系统提供的功能 - 现在,就像动态加载和创建窗口一样。即使一个编译目标(Windows等)只有一个实现,我选择使用运行时抽象,因为我想保证我的其余代码永远不会看到特定于平台的头,并且Windows标题中充满了许多宏和内容,我不希望它们泄漏出来。

答案 5 :(得分:1)

最明显的原因是能够上课“ 在源文件中实现,而不是在头文件中。一切都是 标题中公开的是抽象基类(和工厂函数) 构造它所必需的,但这可能是一个静态成员)。这个 避免必须包含任何成员数据的头文件; pimpl idiom在C ++中更为惯用,但使用类似的抽象类 这远非未知,而且效果也相当不错。