为什么必须将"virtual"放入基类中,而不是仅在子类中使用"override"?在C++
why do you have to put "virtual" into the base class instead of just using the "override" in children? in C++
标题几乎说明了一切。 为什么需要在基类中定义将来可能会覆盖函数?
这样,如果你想从基类派生一个行为不同的版本,你必须修改基类,并且你还没有考虑基类中的那个特定函数来标记虚拟。
据我所知,你通过使用覆盖来解决java中的这种抽象定义(尽管到目前为止我只关注Java)对我来说似乎更自然。c++中的这种扭曲是为了迫使程序员提前思考,还是有技术原因为什么它像这样工作?
这样做是为了使成员函数成为虚拟的决定仍由基类决定。
决定使函数虚拟会对设计产生影响:如果你使函数虚拟,你必须考虑它做不同事情的可能性。相反,您可以指望非虚函数保持不变。
允许override
"从外部"强制虚拟可能会打破函数编写者的假设。此外,这将使单独的编译复杂化,C++因为编译器必须为虚拟函数做一些没有为非虚拟函数做的其他事情,例如从 vtable 或用于实现虚拟调度的其他机制中查找有效地址。
相反,在 Java 中,所有公共实例和受保护实例方法都是虚拟的,除非您将它们定为最终方法。C++没有走这条让类设计完全没有虚函数的路线。Java没有这个选项,因为所有类都继承Object
,而C++允许你使类尽可能轻量级。
如果元类进入C++20,您可以随时使用"接口" (观看视频)
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类