[C ++虚拟调用中的非虚拟函数调用

问题描述 投票:0回答:1

为什么该程序的输出为“ CLASS A”? this是否确定为B型?这不是意味着this-> g()应该调用B类的g版本吗?

#include <iostream>

using namespace std;

class A {
private:
    void g() {
        cout << "CLASS A" << endl;
    }
public:
    virtual void f() {
        g();
    }
};

class B : public A {
public:
    void g() {
        cout << "CLASS B" << endl;
    }
};

int main() {
    A* a = new B();
    a->f();
}
c++ class polymorphism this virtual
1个回答
0
投票

这不是确定为B型吗?

没有B可以是动态类型,但是*this的静态类型在其所有成员函数中均为A

成员函数g不是虚拟的,因此对其的调用使用静态绑定。在静态绑定中,对象的动态类型无关紧要-只有静态类型才重要。对g成员函数中的非虚拟A的调用应为对A::g的调用。

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