c++中子类的子类的继承多态性

问题描述 投票:0回答:1
#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++ class inheritance polymorphism virtual-functions
1个回答
1
投票

根据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
中重写它。程序输出将与原始程序相同。

© www.soinside.com 2019 - 2024. All rights reserved.