#include <iostream>
using namespace std;
class parent {
public:
virtual void f() { cout << "parent::f2()" << endl; }
};
class child : public parent {
public:
void f() { cout << "child::f()" << endl; }
};
class grandchild : public child {
public:
void f() { cout << "grandchild::f()" << endl; }
};
int main() {
grandchild grandchild1;
parent *p = &grandchild1;
p->f();
}
上面的代码运行起来是这样的
grandchild::f()
在类
child
中,我没有将f()
定义为虚函数。为什么p->f()
还在课堂上叫f()
grandchild
?
根据C++20标准(11.7.3虚函数)
1 非静态成员函数如果是第一个则为虚函数 使用关键字 virtual 声明,或者如果它覆盖了 virtual 在基类中声明的成员函数(见下文)。
和
2 如果在类 Base 和 a 中声明了虚拟成员函数 vf 派生类,直接或间接派生自 Base,成员 具有相同名称的函数 vf,参数类型列表 (9.3.4.6), cv 限定符和 ref 限定符(或缺少相同的限定符)作为 Base::vf 声明后,Derived::vf 会覆盖 113 Base::vf。
请注意,即使虚函数也可以隐藏在某些中间派生类中,但它可以在后续派生类中被重写。
也就是说,如果您将按以下方式更改课程
class parent
{
public:
virtual void f() { cout << "parent::f2()" << endl; }
};
class child : public parent
{
public:
void f( int ) { cout << "child::f()" << endl; }
};
class grandchild : public child
{
public:
void f();
};
其中类
f( int )
中声明的函数 child
隐藏了类 f()
中声明的虚函数 parent
,但您可以在类 grandchild
中重写它。程序输出将与原始程序相同。