gpt4 book ai didi

c++ - 有人可以解释多态性的好处吗?

转载 作者:可可西里 更新时间:2023-11-01 18:02:10 25 4
gpt4 key购买 nike

所以我非常了解它的工作原理,但我就是无法理解它的用处。您仍然必须定义所有单独的函数,您仍然必须创建每个对象的实例,所以为什么不直接从该对象调用函数而不是创建对象,创建指向父对象的指针并传递派生对象引用,只是为了调用一个函数?我不明白采取这一额外步骤的好处。

为什么这样做:

class Parent
{
virtual void function(){};
};

class Derived : public Parent
{
void function()
{
cout << "derived";
}
};

int main()
{
Derived foo;
Parent* bar = &foo;
bar->function();
return -3234324;
}

对比这个:

class Parent
{
virtual void function(){};
};

class Derived : public Parent
{
void function()
{
cout << "derived";
}
};

int main()
{
Derived foo;
foo.function();
return -3234324;
}

他们做的事情完全一样,对吗?据我所知,只有一个使用更多的内存和更多的困惑。

最佳答案

您的两个示例做同样的事情,但不同的方式
第一个示例使用 Static binding 调用 function() 而第二个使用动态绑定(bind) 调用它。

在第一种情况下,编译器本身在编译时就知道要调用哪个函数,而在第二种情况下,在运行时根据 Base 指向的对象类型决定应该调用哪个函数类指针。

有什么优势?
优点是更通用和松散耦合的代码。

想象一个类层次结构如下:

enter image description here

使用这些类的调用代码如下:

Shape *basep[] = { &line_obj, &tri_obj,
&rect_obj, &cir_obj};
for (i = 0; i < NO_PICTURES; i++)
basep[i] -> Draw ();

其中,line_objtri_obj等是具体Shape类LineTriangle等的对象, 它们存储在一个指针数组中,指针数组的类型更广义的基类 Shape

这提供了额外的灵 active 和松耦合,如果您需要添加另一个具体的形状类,比如 Rhombus,调用代码不必改变太多,因为它引用了所有具体的形状指向基类 Shape 的指针。您只需要使基类指针指向新的具体类。

同时调用代码可以调用这些类的适当方法,因为 Draw() 方法在这些类中是虚拟的,调用的方法将在运行时根据什么决定基类指针指向的对象。

以上是应用 Open Closed Principle 的一个很好的例子 的著名 SOLID design principles .

关于c++ - 有人可以解释多态性的好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9147521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com