[英]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.