【发布时间】:2021-07-26 07:37:38
【问题描述】:
所以我用 C++ 编程已经有一段时间了,有人告诉我,使用动态转换将抽象类指针的指针转换为不同的具体类指针是不好的做法。
Shape* GeneralShape = new Triangle(...);
Triangle* triPtr = dynamic_cast<Triangle*>(GeneralShape);
Shape 是一个抽象类,而 Triangle 继承自它。
当您继承的一个类与抽象类所包含的通用函数有点不同并且需要更多的通用函数时,使用动态转换似乎是一种访问成员函数的便捷方式。我只是想知道运行时多态有什么不好或开销是多少?
【问题讨论】:
-
"运行时多态的开销是多少?" -
dynamic_cast必须扫描对象的 RTTI 以发现Triangle是否真的继承自 @987654325 @ 以及如何将Shape*指针调整为Triangle*指针。这在运行时需要时间和精力。 -
这不像是概念上的东西那样的开销。您可能会牺牲速度(也可能不会)以换取更容易理解和维护的代码。旁注:当你发现自己让继承类有点不同时,你可能会反对Liskov Substitution Principle,并且没有你想象的那么好的继承候选者。
标签: c++ inheritance polymorphism abstract-class run-time-polymorphism