【发布时间】:2019-06-26 11:15:10
【问题描述】:
在 C++ 中使用多态性与仅使用继承相比有什么优势,因为在我看来,使用多态性我无法实现仅使用继承无法做到的事情。同样在这两种方式中,我都可以使用虚拟功能。是否存在多态性可以做一些仅使用继承无法实现的情况?
这两个例子(第一个 - 多态性,第二个 - 单纯继承)让我达到了相同的结果,所以我想知道 polymphism 还能为我提供什么,而这是通过正常继承无法实现的。
多态代码:
#include <iostream>
using namespace std;
class Kryptonians
{
public:
void setPower(int p) {power = p;}
void gotHit(int h){power -=h;}
virtual void displayPower(){std::cout << "power is: " << power << "\n";}
protected:
int power;
};
class Supergirl: public Kryptonians
{
public:
void displayPower(){
std::cout << "Supergirl's power is: " << power << "\n";}
};
class Superman: public Kryptonians
{
public:
void displayPower(){
std::cout << "Superman's power is: " << power << "\n";}
};
int main()
{
Supergirl sup;
Superman super;
Kryptonians *supergirl = ⊃
Kryptonians *superman = &super;
supergirl->setPower(100);
supergirl->displayPower();
superman->setPower(100);
superman->gotHit(50);
superman->displayPower();
supergirl->displayPower();
}
仅仅是继承代码:
#include <iostream>
using namespace std;
class Kryptonians
{
public:
void setPower(int p) {power = p;}
void gotHit(int h){power -=h;}
virtual void displayPower(){std::cout << "power is: " << power << "\n";}
protected:
int power;
};
class Supergirl: public Kryptonians
{
public:
void displayPower(){
std::cout << "Supergirl's power is: " << power << "\n";}
};
class Superman: public Kryptonians
{
public:
void displayPower(){
std::cout << "Superman's power is: " << power << "\n";}
};
int main()
{
Supergirl supergirl;
supergirl.setPower(100);
supergirl.displayPower();
Superman superman;
superman.setPower(100);
superman.gotHit(50);
superman.displayPower();
supergirl.displayPower();
}
我的问题是关于为什么要使用多态性,什么时候可以很好地避免使用它,并限制自己只使用继承。正如 user463035818 所说,基本上不存在多态性可以做一些使用继承无法实现的事情。所以据我了解,使用多态是首选的设计模式?
【问题讨论】:
-
动态多态性是通过继承实现的。我不明白这个问题。
-
如果您向我们展示同一问题的两种解决方案会更容易,一种使用(您称之为)多态性,另一种使用(您称之为)继承。
-
请为每种情况提供一个示例 sn-p,以便我们更好地了解您要比较的两种情况。 (对我来说,它们是一样的)
-
你的意思是composition over inheritance?不,显然不会重读。我和其他人一起困惑。
-
我知道多态是通过继承实现的。然而,我问我还能用多态性做什么,而仅仅通过继承是不可能的。
标签: c++ inheritance polymorphism