C++函数覆盖

Miz*_*zor 19 c++ polymorphism overriding function

我有三个不同的基类:

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

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

class BaseC
{
public:
    int foo() { return 42; }
};
Run Code Online (Sandbox Code Playgroud)

然后我从这个基础派生出来(用A替代A,B或C):

class Child : public BaseX
{
public:
    int foo() { return 42; }
};
Run Code Online (Sandbox Code Playgroud)

如何在三个不同的基类中重写该函数?我的以下三个假设是否正确?还有其他警告吗?

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

Tod*_*ner 16

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

但是,使用C,函数不会被覆盖,而是会被重载.在那种情况下,只有静态类型很重要:它会调用它的指针(静态类型)而不是对象的真实类型(动态类型)


Jar*_*aus 14

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

  • 有了BaseA它,它将按照预期进行编译和执行,具有foo()虚拟和在类中执行Child.
  • 与之相同BaseB,它也将按照预期进行编译和执行,其中包含foo()virtual()并在类中执行Child.
  • 随着BaseC但是,它将编译并执行,但它会执行BaseC,如果你从上下文中调用它的版本BaseC,以及Child版本,如果你用的情况下调用Child.