首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++函数重写

C++函数重写
EN

Stack Overflow用户
提问于 2009-06-22 15:06:08
回答 6查看 40.6K关注 0票数 19

我有三个不同的基类:

class BaseA
{
public:
    virtual int foo() = 0;
};

class BaseB
{
public:
    virtual int foo() { return 42; }
};

class BaseC
{
public:
    int foo() { return 42; }
};

然后,我像这样从基派生(用X代替A、B或C):

class Child : public BaseX
{
public:
    int foo() { return 42; }
};

如何在三个不同的基类中重写该函数?我的三个假设是正确的吗?还有其他的注意事项吗?

  • 使用BaseA时,子类不会编译,未定义纯虚函数。
  • 使用BaseB时,在BaseB*或Child*上调用foo时会调用子函数中的函数。
  • 在BaseC中时,会在BaseB*上调用foo时调用子函数,但不会在BaseB*上调用(调用父类中的函数)。
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-06-22 15:11:52

在派生类中,如果方法在基类中定义为虚拟的,则该方法是虚拟的,即使在派生类的方法中未使用关键字virtual。

对于带有BaseA

  • ,它将按预期进行编译和执行,其中foo()是虚拟的,并在带有BaseB的类Child.
  • With中执行;它也将按预期进行编译和执行,其中foo()是虚拟的(),并在类Child.

BaseC中执行。但是,它将进行编译和执行,但如果您从BaseC的上下文调用它,它将执行BaseC版本;如果您使用Child.

  • With的上下文调用它,它将执行<BaseC>版本
票数 14
EN

Stack Overflow用户

发布于 2009-06-22 15:10:00

要记住的重要规则是,一旦一个函数被声明为虚拟的,在派生类中具有匹配签名的函数始终是虚拟的。因此,它被A的孩子和B的孩子覆盖,这两个孩子的行为是相同的(除了你不能直接实例化BaseA)。

然而,在C中,函数不会被覆盖,而是会被重载。在这种情况下,只有静态类型才重要:它将根据指向的指针(静态类型)来调用它,而不是根据对象实际是什么(动态类型)来调用它。

票数 16
EN

Stack Overflow用户

发布于 2009-06-22 15:13:41

使用BaseA时为

,则子类不编译,未定义纯虚函数

只有当您尝试创建BaseA的对象时,才会出现这种情况。如果您创建了Child对象,然后可以使用BaseA*或Child*调用foo()

如果使用BaseB,则在BaseB*或

*上调用foo时,将调用子对象中的函数。

取决于对象的类型,因为对象可以是BaseB或子项。如果对象为BaseB,则调用BaseB::foo。

使用BaseC,在

*上调用foo时,会调用子类中的函数,但不会在BaseB*上调用(调用父类中的函数)。

是的,但你永远不会想这么做的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1027724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档