如上所述
https://standardofnorms.wordpress.com/2012/09/02/4-pillars-of-object-oriented-programming/
并且作为许多求职面试中的正确答案 - 该问题的一般正确答案: “OOP的四大支柱是什么?”是:
抽象
封装
继承
多态性
我无法理解的是多态性中没有包含继承?
换句话说,如何在不使用继承的情况下使用多态?
我知道使用多态的唯一方法是
class A{
virtual void foo(){cout<<"A";}
void bar(){cout<<"A";}
};
class B : public A{
virtual foo(){cout<<"B";}
};
A* ab = new B();
ab->foo();//prints B, using polymorphism
ab->bar();//prints A, using inheritance
A* a = new A();
a->foo();//prints A
a->bar();//prints A, obviously
正如我所看到的,多态性带来了继承。
请解释为什么它是独特的 - 或者为什么不能将遗产作为其自身的关键支柱而被丢弃。我们可以使用多态性。
答案 0 :(得分:1)
据我了解这两个概念:
<强>继承强>
您可以在不使用polymorphisim的情况下使用继承。例如:
<form name ="frm" action="upload.php" method="post" enctype="multipart/form- data">
Select image to upload:
<input type="file" name="photoname" id="photoname">
<input type="submit" value="Upload Image" name="submit" onclick="window.opener.frm.photoname.value=document.frm.photoname.value">
</form>
这里我们在所有派生类型中使用基类型的通用功能,但在任何时候我们都不做任何多形性的事情(我们从不通过它的基本接口查看派生实例)。
<强>多态性强>
作为一个概念的多态性不仅包括最常见的基于标准继承的方法。这实际上是一种亚型,它只是一种多态性。
编写模板方法在技术上是一种多形态,并且函数会重载另一种。作为一个概念,你可以说许多其他事情是实现多态性的方法。
例如:
class Base {
public:
void foo();
};
class Derived : public Base {
};
int main() {
Derived d;
d.foo();
}
这是没有继承的多态行为。
请参阅:https://stackoverflow.com/a/10556406/1230538,以便对其他人的解释进行非常好的解释。
<强>摘要强>
99%你使用继承来实现大多数现代编程语言中的多态,但它们是不同的概念,可以相互独立地存在/使用。
答案 1 :(得分:1)
我无法理解的是如何不包含遗传 多态性?
换句话说,如何在不使用多态的情况下使用 传承?
有三种主要类型的多态性,其中只有一种需要继承才能工作。
Ad-hoc多态:这通常称为函数/方法重载,其中多个函数可以共享相同的名称但具有不同的签名。返回类型是否是签名的一部分取决于语言。
参数化多态:在OOP中,这通常称为泛型,其中函数/方法可以使用多种具体类型,并返回多种具体类型,从而提供编译时安全性。
子类型多态性:这是我认为大多数人在谈论多态时所想到的。如您所知,这是在子类型提供其父函数/方法的不同实现时。
您可以在维基百科文章中详细了解不同类型的多态性:https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
答案 2 :(得分:-1)
没有继承的多态性:
<div class="box">
<p class="text-container" data-short-version="Rudolf E. Raspe" data-long-version="Rudolf Erich Raspe"></p>
<p class="text-container" data-short-version="Baron Munchausen" data-long-version="Hieronymus Karl Friedrich von Munchhausen"></p>
</div>
.text-container:before {
content:attr(data-short-version);}
.text-container { width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size:40px;
margin:0px;}
@media screen and (min-width:600px) {
.text-container:before {
content:attr(data-long-version);
}
}
两个实例都有相同的方法。所以它们是多态的。但是,该方法做了不同的事情,因为对象毕竟是不同的。