在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:函數能否調用,是在編譯階段看指針類型裏面函數的修飾符。