C++是一种面向价值的语言,似乎不支持OO(因此也就是子类型多态).对于参数多态,缺乏类型参数的类型推断和模板的详细语法使得它们难以使用.
请注意,我所熟知的唯一语言是Java(子类型多态)和Haskell(参数多态).两种语言都倾向于一种多态性.然而,C++支持(在某种程度上),但两者似乎都在我认为不直观的问题上工作.因此,当使用C++进行编程时,我很难确定应该采用何种方式编写代码.
所以我的问题是在C++中哪种多态被认为更惯用?
编辑1:
解释我的"C++不支持OO"点:
动态方法调度和LSP在OO中很常见,不是吗?但是当谈到C++时,不使用指针(原始或智能)来应用这些技术是不可能的(或实际的).
例如,考虑一个Person
带有virtual
方法的类,该方法print
将其名称输出到控制台.让另一个课程Student
延伸Person
并覆盖,print
以打印他的名字加上他学校的名字.
现在考虑以下功能:
void blah(const Person & p) {
p.print();
}
Run Code Online (Sandbox Code Playgroud)
在这里,如果我传递一个Student
对象,print
方法将调用print
从Person
,不从Student
.因此,它违背了亚型多态性的基本思想.
现在我知道在这种情况下我可以使用动态分配(即指针)来实现子类型多态.但是静态分配在C++中更常见.指针用作最后的手段(我记得在这里读过其他一些帖子).所以我觉得很难调和推荐静态分配而不是动态分配的好实践(这就是我说C++是值时的意思具有亚型多态性的.)
当使用Java时,我倾向于全面使用动态分配,因此子类型多态性在那里很自然.但是,C++并非如此,
希望我的观点现在清楚了.
编辑2:
好吧,我在编辑1中给出的例子是错误的.但我的观点仍然有效,我已多次面对这个问题.我无法回忆起我头脑中的所有这些案例.
这是我想到的一个案例.
在Java中,您可以在类中引用超类型,然后使它们指向任何子类型的实例.
例如,
class A {
B y1;
B y2;
}
abstract class B {
// yada yada
}
class B1 exyends B {
// yada yada
}
class B2 extends B {
// …
Run Code Online (Sandbox Code Playgroud)