4

我有头文件“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

和一个源文件

#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;
}

在这里,我想知道当我调用“b->Foo”时,调用的是 B 类的 Foo 函数而不是 A 类。但是,B 类的 Foo 函数没有声明为虚拟函数。谁能详细说明这个??

4

2 回答 2

8

virtual一旦一个函数在基类中被声明为虚函数,在派生类的函数中是否使用关键字就无关紧要了。它在派生类中始终是虚拟的(无论是否如此声明)。

从 C++11 标准 10.3.2 开始:

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

于 2012-05-23T00:55:04.483 回答
3

B::Foo不需要声明为虚拟的——事实上A::Foo是虚拟的并且 B 从 A 派生意味着它是虚拟的(并且被覆盖)。查看有关虚拟功能的msdn 文章了解更多信息。

于 2012-05-23T00:55:14.433 回答