我有头文件"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函数未被声明为虚拟.任何人都可以详细说明吗?
一旦函数在基类中声明为虚函数,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....