簡體   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