如前所述
https://standardofnorms.wordpress.com/2012/09/02/4-pillars-of-object-oriented-programming/
在许多求职面试中,正确的答案是:“面向对象的四大支柱是什么?”是:
我不明白的是,遗传是如何不包含在多态性中的?
换句话说,如果不使用继承,如何使用多态性?
我所知道的使用多态性的唯一方法是
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在我看来,多态带来了继承。
请解释为什么它是不同的,或者为什么不能放弃继承作为它自己的一个关键支柱。我们可以用多态也可以不用。
发布于 2016-07-12 14:31:54
我不明白的是,遗传是如何不包含在多态性中的? 换句话说,在没有继承的情况下,如何使用多态性?
有三种主要的多态性类型,其中只有一种需要继承才能工作。
您可以从维基百科的文章中了解更多关于不同类型多态性的信息:science)
发布于 2016-07-12 14:12:44
据我所知,这两个概念:
继承
您可以使用继承而不使用polymorphisim。例如:
class Base {
public:
void foo();
};
class Derived : public Base {
};
int main() {
Derived d;
d.foo();
}在这里,我们在所有派生类型中使用基本类型的公共功能,但在任何时候我们都不做任何多方面的事情(我们从不通过它的基本接口来查看派生实例)。
多态性
多态作为一个概念包含的不仅仅是标准的基于继承的方法。这实际上是亚型,这只是一种多态性。
从技术上讲,编写模板方法是一种多向性,而函数重载则是另一种形式。作为一个概念,你可以争辩说,许多其他的东西是实现多元主义的方式。
例如:
// This function must be given an object that has a method foo().
template <typename T> bar(T& t) {
t.foo();
}这是没有继承的多态行为。
参见:https://stackoverflow.com/a/10556406/1230538对其他人给出的一个很好的解释。
摘要
在大多数现代编程语言中,99%的人使用继承来实现多态性,但它们是不同的概念,可以相互独立地存在/使用。
发布于 2016-07-12 14:12:31
没有继承的多态性:
class A {
virtual void foo() { cout << "A"; }
};
class B {
virtual void foo() { cout << "B"; }
};
A* a = new A();
A* b = new B();
a->foo(); // prints A
b->foo(); // prints B这两个实例都有相同的方法。所以它们是多态的。但是,由于对象毕竟是不同的,所以方法做的事情不一样。
https://stackoverflow.com/questions/38330357
复制相似问题