使用非虚函数覆盖虚函数

时间:2012-05-23 00:49:33

标签: 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

和源文件

#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函数未被声明为虚拟。任何人都可以详细说明这个吗?

2 个答案:

答案 0 :(得分:8)

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

从C ++ 11标准,10.3.2:

  

如果在类Base和a中声明了虚拟成员函数vf   class派生,直接或间接来自Base,一个成员   函数vf,同名,参数类型列表(8.3.5),   与Base :: vf相关的cv-qualification和refqualifier(或不存在)   声明,然后Derived :: vf也是虚拟的(无论是否是这样   声明)并覆盖Base :: vf。 ...

答案 1 :(得分:3)

B::Foo不需要声明为虚拟 - A::Foo是虚拟的,而B派生自A意味着它是虚拟的(并且被覆盖)。查看虚拟功能的msdn article以获取更多信息。