gpt4 book ai didi

c++ - 为什么 'virtual' 对于派生类中的重写方法是可选的?

转载 作者:IT老高 更新时间:2023-10-28 22:26:40 24 4
gpt4 key购买 nike

当一个方法在类中声明为 virtual 时,它在派生类中的覆盖也自动被视为 virtual,C++ 语言将这个关键字设为 虚拟 在这种情况下是可选的:

class Base {
virtual void f();
};
class Derived : public Base {
void f(); // 'virtual' is optional but implied.
};

我的问题是:将 virtual 设为可选的理由是什么?

我知道编译器并非绝对有必要被告知,但我认为如果编译器强制执行这样的约束,开发人员将会受益。

例如,有时当我阅读其他人的代码时,我想知道一个方法是否是虚拟的,我必须追踪它的父类(super class)来确定这一点。并且一些编码标准 (Google) 要求将 virtual 关键字放在所有子类中。

最佳答案

是的,在这种情况下让编译器强制执行虚拟会更好,我同意这是为了向后兼容而维护的设计错误。

但是,如果没有它,有一个技巧是不可能的:

class NonVirtualBase {
void func() {};
};

class VirtualBase {
virtual void func() = 0;
};

template<typename VirtualChoice>
class CompileTimeVirtualityChoice : public VirtualChoice {
void func() {}
};

通过以上我们可以选择是否需要 func 的虚拟性:

CompileTimeVirtualityChoice<VirtualBase> -- func is virtual
CompileTimeVirtualityChoice<NonVirtualBase> -- func is not virtual

...但同意,这对于寻求函数的虚拟性的成本来说是一个小好处,而我自己总是尝试在任何适用的地方输入 virtual。

关于c++ - 为什么 'virtual' 对于派生类中的重写方法是可选的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2963965/

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