"upcasting"的缺点是什么?
What are the disadvantages of "upcasting"?
抽象类的目的不是让开发人员创建基类的对象,然后向上转换
现在,即使不需要向上转换,我仍然使用它,它是否在某种程度上证明是"不利的" ?更多的澄清:
通常在设计中,您希望基类只显示一个接口,用于其派生类。也就是说,你不想让任何人知道实际上创建一个基类的对象,只是为了向上转换到它,以便它的接口可以使用。这是通过创建这个类来完成的抽象的,
我指的是:baseClass *obj = new derived ();
对于非多态类来说,向上转换可能是不利的。例如:
class Fruit { ... }; // doesn't contain any virtual method
class Apple : public Fruit { ... };
class Blackberry : public Fruit { ... };
把它放在某个地方,
Fruit *p = new Apple; // oops, information gone
现在,您将永远不会知道(没有任何手动机制),如果*p
是Apple
或Blackberry
的实例。
dynamic_cast<>
不允许非多态性类]抽象类用于表达一组(子)类所共有的概念,但对于这些概念,创建实例是不明智的。
考虑一个类Animal
。创建这个类的实例是没有意义的,因为不存在仅仅是动物的东西。有鸭子、狗和大象,它们都是动物的一个亚纲。通过正式声明类animal,您可以捕获所有类型动物的相似之处,并且通过使其抽象,您可以表示它不能被实例化。
Edit:升级不是不利的。事实上,您应该尽可能使用它,使您的代码依赖于超类(接口)而不是基类(实现)。这使您以后可以在不更改代码的情况下切换实现。
升级是一种技术工具。
就像所有的工具一样,如果使用正确,它是有用的,如果使用不一致,它是危险的。
它可以是好或坏,这取决于你希望你的代码在给定的编程范例中有多"纯粹"。
现在,c++不一定是"纯面向对象",不一定是"纯泛型",不一定是"纯函数"。而且,由于c++是一种"实用语言",一般来说,强迫它适应"唯一的范式"并不是一种优势。
用专业术语来说,唯一能说的是,
- 派生类是一个基类加上更多的东西
- 通过基指针引用派生类使得"更多的东西"无法访问,除非基类中有一种机制使您跳转到派生作用域。
- c++为隐式跳转提供的机制是虚函数。
- c++为显式跳转提供的机制是
dynamic_cast
(用于向下转换)。 - 对于非多态对象(没有任何虚拟方法)
static_cast
(downcast)仍然可用,但没有运行时检查。
优点和缺点源于对所有这些点的一致和不一致的使用。
一个缺点是明显失去了派生类中引入的新功能:
class A
{
void foo();
}
class B : public A
{
void foo2();
}
A* b = new B;
b->foo2(); //error - no longer visible
我在这里讨论的是非虚函数。
另外,如果忘记将析构函数设置为虚函数,则在通过指向基类对象的指针删除派生类对象时可能会出现内存泄漏。
然而,所有这些都可以通过一个好的架构来避免。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- "upcasting"的缺点是什么?