“珊瑚海”裏的虛函數

在c++裏面,基類和繼承類有三層的關係。

1:重載,對重載來說,必須是相同的作用域,函數名相同,函數的參數列表不同。

2:隱藏。所謂隱藏就是派生類把基類的同名的函數給隱藏了。在派生類對象調用此

 函數的時候只能調用派生類的函數。基類的函數被隱藏了。

3:覆蓋。在基類的函數名前面加上virtual(即虛擬的)時,此函數就成了虛函數。

如果在派生類裏面,有同名,同參數的,同返回值時,此函數也就成了虛函數。

這就是覆蓋。

例如:

#include<iostream>

using namespace std;

class A

{
public:
A(int val = 12){}
virtual void show()
{
cout << "A is show()" << endl;
cout << ma <<endl;
}
protected:
int ma;
};
class B:public A
{
public:
B(int size = 10) :mb(size), A(size){}
void show()
{
cout << "B is show()" << endl;
cout << mb << endl;
}
private:
int mb;
};
int main()
{
B b;
A *p =&b;
p->show();
return 0;
}

對於A類和B類的內存佈局是:





一些問題?

1:在那些情況下會發生多態那?

只要是使用指針或者引用,而且調用的函數是虛函數,就可以發生多態。

2:vfptr可以交換,而且vfptable是在編譯的情況下產生的,運行的時期加載到.rodata段。

3:函數能否調用,是在編譯階段看指針類型裏面函數的修飾符。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章