繁体   English   中英

关于C ++虚函数的困惑

[英]A confusion about c++ virtual function

只看下面的两个类。 当我在“ main”中调用函数时,编译和程序运行时会发生什么?

#include <iostream>
#include <string>
using namespace std;
class A{
public:
    virtual void fun2(){cout<<"A::fun2"<<endl;}
};
class B : public A{
public:
    void fun2(){cout<<"B::fun2"<<endl;}
};
int main() {
    A *a = new B();
    B *b = new B();
    //What's the differences among the followings?
    a->A::fun2();
    b->A::fun2();
    A::fun2();

    return 0;
}

我知道要打印什么程序,但是我想知道为什么。 我知道对象中有一个虚函数表,但是当我调用

a-> A :: fun2()

, 这个怎么运作? 由于在a或b的v表中,fun2()将打印B :: fun(),程序如何进入函数A :: fun2()?

a->A::fun2();

将打印A :: fun2


b->A::fun2();

将打印A :: fun2


A::fun2();

不会被编译

从您通过显式作用域运算符调用成员函数的那一刻起,例如

instanceptr->Scope::memberfun()

它不再是虚拟函数调用。 只是不再通过v-table机制调用该函数。

您的示例中的B类扩展了A类,但这并不意味着成员函数A::fun2()的代码不再存在-它存在于目标文件中,并且编译器直接调用该函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM