小编Jim*_*Jim的帖子

什么样的多态在C++中被认为更惯用?

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方法将调用printPerson,不从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)

c++ polymorphism programming-languages idiomatic

1
推荐指数
1
解决办法
693
查看次数