使用非虚函数覆盖虚函数

jer*_*rry 4 c++

我有头文件"testcode.h"

#ifndef TESTCODE_H
#define TESTCODE_H

class A
{
public:
    A();
    ~A();
    virtual void Foo();

public:
    int mPublic;

protected:
    int mProtected;

private:
    int mPrivate;
};

class B : public A
{
public:
    B();
    ~B();
    void Foo();
};

#endif // TESTCODE_H
Run Code Online (Sandbox Code Playgroud)

和一个源文件

#include "TestCode.h"

int main(int argc, char* argv[])
{
    A* b = new B();
    b->Foo();

    b->mPublic = 0;
    b->mProtected = 0;
    b->mPrivate = 0;

    delete b;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我想知道当我调用"b-> Foo"时,调用类B的Foo函数而不是类A.但是,类B的Foo函数未被声明为虚拟.任何人都可以详细说明吗?

Joh*_*nPS 8

一旦函数在基类中声明为虚函数,virtual关键字是否在派生类的函数中使用并不重要.它总是在派生类中是虚拟的(无论是否如此声明).

从C++ 11标准,10.3.2:

如果虚拟成员函数vf在类Base和Derived类中声明,直接或间接从Base派生,则具有相同名称的成员函数vf,parameter-type-list(8.3.5),cv-qualification和声明了Base :: vf的refqualifier(或不存在),然后Derived :: vf也是虚拟的(无论是否声明)并且它覆盖Base :: vf....