派生类中的虚拟限定符
virtual qualifier in derived class
派生类中基类虚函数的虚限定符有区别吗?
class b
{
public:
virtual void foo(){}
};
class d : public b
{
public:
void foo(){ .... }
};
或
class d : public b
{
public:
virtual void foo(){ .... }
};
这两个声明有什么不同,除了它使d的子元素知道foo()的虚拟性吗?
这没什么区别。foo
在所有从b(及其后代)派生的类中都是虚的。
来自c++ 03标准,§10.3.2:
如果在Base类中声明虚成员函数vf,在直接或间接从Base派生的派生类中声明与Base::vf具有相同名称和相同形参列表的成员函数vf,则Derived::vf也是虚的(无论是否这样声明)并覆盖Base::vf。
没有区别-无论哪种方式都是虚拟覆盖。
这是一个风格问题,这里已经明确讨论过了
包含virtual关键字是更好的样式。但这不是必需的
无差异
一旦foo
是虚的,它的虚的在类层次结构中永远是虚的,不管你离类层次结构中的基有多远。
但是我更喜欢在重写函数中编写virtual
,因为它为代码增加了可读性,这很重要。
相关文章:
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 虚拟基类函数中派生类的大小
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 派生类中纯虚拟基方法的专业化
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 无法在派生对象上运行虚拟函数
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 从基调用派生类的隐藏(非虚拟)方法
- 派生类可以有多个指向虚拟表的指针
- 如何从派生类函数中调用虚拟函数
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 虚拟派生和转换模棱两可
- 删除虚拟派生类的this和位置new