我有头文件“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函数未被声明为虚拟。任何人都可以详细说明这个吗?
答案 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以获取更多信息。