【发布时间】:2012-08-19 19:06:02
【问题描述】:
简单地说,如何在 C++ 中为单级继承创建接口(出于简单和教学的原因)?我看到一些代码没有使用多态性,但基类包含一个虚拟抽象方法 (virtual void TheMethod() = 0)。
现在从这个抽象类派生了一个类,使用纯虚方法,但是在随后的代码中,使用派生类的实例根本没有动态分配。
这是正确的方法吗?使用多态设计推断的开销如何?
我认为这是不可能的。这看起来更像是隐藏/重影基本方法,即使该方法是纯虚拟方法。
稍后编辑:感谢所有设法提供一些好的答案的人,我想强调一个严重错误,该错误是由于使用“动态分配”而引起的,其含义是强调这一点对象创建可能性是唯一与多态性兼容的可能性。很明显,这不是利用这种运行时调用行为的唯一方法(但可能是最常见的方法?),而是进一步澄清我最初的问题:
有没有办法强制程序员在不使用纯虚方法的情况下实现一个方法?我也许不合理的担心是是否打开了多态设计的大门是否也有点沉重性能方面(每秒对所讨论的方法进行数千次此类调用)。
甚至稍后编辑:使基础具有受保护的构造函数意味着它不能直接实例化(除了使用工厂或其他友好的方式),这可以解决补偿纯虚拟的效果之一方法诱导。但是如何确保任何派生类仍然提供自己的方法实现呢?如果对关联的 vtable 的担心可能有点过分,真的没什么大不了的,我会坚持使用纯虚拟方法(因为 SFINAE 奇怪的重复模板模式更难被不熟悉的人阅读和理解)最少的中级 C++ 程序员 - 像我一样 :) )。
【问题讨论】:
-
动态分配与 OOP 尤其是多态无关。
-
我不确定我是否理解这个问题,但即使没有动态分配,也可以在需要对基类的指针/引用的地方使用对这个派生类的指针/引用。此外,这种情况下的开销可能非常小(每个实例最多一个额外的指针,在某些函数调用中还有一些额外的间接)。
-
@Lyth 是也不是。使用多态对象的重点是直到运行时才知道对象的类型,这几乎需要动态分配。
-
@JamesKanze:也是,不是。即使在编译时知道实际类型,使用动态绑定也是有意义的:替代方法是使用模板,但您可能希望在单独的编译单元中拥有东西,并且仍然能够处理满足给定的多个类型界面。
-
@JamesKanze 对象的多态行为不需要动态分配。无论派生对象是如何创建的或它们驻留在何处,您都可以通过基类对它们进行操作,而无需了解任何实现细节(考虑各种对象的静态池)。
标签: c++ inheritance polymorphism virtual