【问题标题】:C++ Non-virtual function call in a virtual call虚拟调用中的 C++ 非虚拟函数调用
【发布时间】:2020-07-02 10:34:44
【问题描述】:

为什么这个程序的输出是“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();
}

【问题讨论】:

  • 你做错了函数virtualg 函数需要是 virtual,而不是 f
  • 只有f() 是虚拟的,而不是g() - g() 将是早期绑定,而不是后期绑定。如果是从虚函数调用也没关系。

标签: c++ class polymorphism this virtual


【解决方案1】:

这不是确定为B型吗?

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

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

【讨论】:

    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2017-08-13
    • 2014-01-04
    相关资源
    最近更新 更多