C ++类:虚拟和重写,还是都不提供?

技合资金

它实际上是需要使用两种 virtual override

我知道有关此一般主题有很多问题,例如:

从这些以及其他标记为重复的(对许多“重复”的答案至少包含了对我来说不陌生的独特信息)中,我学到了一些东西(我想大概是为什么它们是真实的) ):不带虚拟的覆盖将无法编译。无覆盖的虚拟将编译,但是如果您犯了一个错误并且没有正确的方法签名,则编译器不会告诉您。

但是,如果我都忽略怎么办?例:

struct BaseClass {
    int a_number() {
        return 1;
    }
};
struct DerivedClass : BaseClass {
    int a_number() {
        return 2;
    }
};

a_number无论我实例化BaseClass还是,它都会编译并返回适当的结果DerivedClass因此,它的行为就好像我已经覆盖了该功能。上面的代码有错误的原因吗?是向后兼容的问题,还是更多?

如果在我错过的相关问题之一中直接回答了这个问题,我深表歉意,谢谢。

编辑:StackOverflow不断指出派生类中函数C ++“虚拟”关键字。有必要吗?问题,就像Wyck在下面所做的那样。我不认为这解决了我的问题,因为我在评论中给了他/她,因为它们是暂时的,所以我在这里重复:“我特别在询问超类方法中的虚拟,而那个帖子似乎关于子类中的虚拟及其传播方式。下面接受的答案回答了我的问题,但我认为您的链接没有(它可能会为具有C / C ++经验的人回答这个问题,但我不认为它回答来自像我这样的Python和Java的新手)。”

重点是:我认为这些问题是相关的,但并不相同。

我已经接受了selbie的回答,因为这是第一个完整的“答案”回答了我的问题。Wyck的答案提供了许多有用的,更一般的信息。

塞尔比

如已声明的那样(没有虚拟方法),如果BaseClass::a_number不声明virtual则将其实例DerivedClass化为as时BaseClass将不会调用DerivedClass

例:

BaseClass* instance1 = new DerivedClass();
instance1->a_number();  // returns "1", even though the object is really an instance of Derived

如果BaseClass声明如下:

struct BaseClass {
    virtual int a_number() {
        return 1;
    }
};

然后以下代码将按您期望的那样工作

BaseClass* instance2 = new DerivedClass();
instance2->a_number();  // returns "2", virtual method invocation

override关键字是可选的,但在DerivedClass建议:

struct DerivedClass : BaseClass {
    int a_number() override {
        return 2;
    }
};

正如您已经观察到的那样,override不会更改程序的行为,但是,如果a_number未在中进行相同的声明BaseClass,则编译器将发出错误。这对于捕获打字错误非常有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类型“类名”不提供呼叫操作员。C ++

来自分类Dev

C ++:重写从模板类派生的虚拟纯函数

来自分类Dev

C ++中的密封类和虚拟继承

来自分类Dev

重写C#中的类并访问使用重写方法的虚拟方法

来自分类Dev

在C ++中,是否可以分别声明和实例化不提供默认构造函数的类的实例,并将其实例化(两个步骤)

来自分类Dev

用C重写C ++类

来自分类Dev

const和非const引用成员的C ++类重写

来自分类Dev

Cassandra何时不提供W / R设为QUORUM的C,A和P?

来自分类Dev

C ++多态性:派生类调用基类虚拟函数,而不是重写的派生类

来自分类Dev

C ++派生类和虚拟析构函数

来自分类Dev

C ++派生类和虚拟析构函数

来自分类Dev

使用C ++自动完成(Shell不提供)

来自分类Dev

即使它们是私有的,基类的好友函数如何调用派生类的重写虚拟函数?(C ++)

来自分类Dev

C ++类模板或纯虚拟

来自分类Dev

C ++中虚拟类的向量

来自分类Dev

IntelliJ IDE悬停-什么都不提供?

来自分类Dev

每个商店都不提供的产品

来自分类Dev

IntelliJ IDE悬停-什么都不提供?

来自分类Dev

为C ++中的基类和派生类声明“虚拟”构造函数?

来自分类Dev

C ++多重和虚拟继承

来自分类Dev

虚拟和模板方法C ++

来自分类Dev

C ++多重和虚拟继承

来自分类Dev

从Powershell调用C#方法而不提供可选参数

来自分类Dev

如何在目标C中从超类重写私有方法和属性

来自分类Dev

如何在目标C中从超类重写私有方法和属性

来自分类Dev

C ++虚拟继承和访问公共虚拟方法,该方法的实现在继承受保护的类中

来自分类Dev

在Swift中重写Objective C类方法

来自分类Dev

在C ++中调用Helper类的重写方法

来自分类Dev

C ++使用动态绑定和纯虚拟类时正确的语法是什么?

Related 相关文章

  1. 1

    类型“类名”不提供呼叫操作员。C ++

  2. 2

    C ++:重写从模板类派生的虚拟纯函数

  3. 3

    C ++中的密封类和虚拟继承

  4. 4

    重写C#中的类并访问使用重写方法的虚拟方法

  5. 5

    在C ++中,是否可以分别声明和实例化不提供默认构造函数的类的实例,并将其实例化(两个步骤)

  6. 6

    用C重写C ++类

  7. 7

    const和非const引用成员的C ++类重写

  8. 8

    Cassandra何时不提供W / R设为QUORUM的C,A和P?

  9. 9

    C ++多态性:派生类调用基类虚拟函数,而不是重写的派生类

  10. 10

    C ++派生类和虚拟析构函数

  11. 11

    C ++派生类和虚拟析构函数

  12. 12

    使用C ++自动完成(Shell不提供)

  13. 13

    即使它们是私有的,基类的好友函数如何调用派生类的重写虚拟函数?(C ++)

  14. 14

    C ++类模板或纯虚拟

  15. 15

    C ++中虚拟类的向量

  16. 16

    IntelliJ IDE悬停-什么都不提供?

  17. 17

    每个商店都不提供的产品

  18. 18

    IntelliJ IDE悬停-什么都不提供?

  19. 19

    为C ++中的基类和派生类声明“虚拟”构造函数?

  20. 20

    C ++多重和虚拟继承

  21. 21

    虚拟和模板方法C ++

  22. 22

    C ++多重和虚拟继承

  23. 23

    从Powershell调用C#方法而不提供可选参数

  24. 24

    如何在目标C中从超类重写私有方法和属性

  25. 25

    如何在目标C中从超类重写私有方法和属性

  26. 26

    C ++虚拟继承和访问公共虚拟方法,该方法的实现在继承受保护的类中

  27. 27

    在Swift中重写Objective C类方法

  28. 28

    在C ++中调用Helper类的重写方法

  29. 29

    C ++使用动态绑定和纯虚拟类时正确的语法是什么?

热门标签

归档