#include <iostream>
using namespace std;
class A
{
int x;
public:
A(int i){x=i;}
virtual ~A(){};
virtual void dispa(){cout<<"x="<<x<<endl;}
};
class B:public A
{
int y;
public:
B(int i, int j):A(i){ y=j;}
void dispb(){cout<<"y="<<y<<endl;}
virtual void fun(){};
};
int _tmain(int argc, _TCHAR* argv[])
{
A a(10), *p;
B b(20, 30);
p = &a;
p->dispa();
p = &b;
p->dispa();
cout<<"sizeof(A)="<<sizeof(A)<<endl;
cout<<"sizeof(B)="<<sizeof(B)<<endl;
return 0;
}
一個類或類對象隻配置設定一個vptr的位址。
從記憶體上來看
如A
---------|
|占一個int資料大小--|
|----(x資料)------|
|---------
而B則是
---------|---------
|占一個int資料大小--|占一個Int資料大小--|
|從A中繼承而來------|---(y資料----------|
|------------------
當定義一個基類類型的指針時
A *p;這時,這個指針指向的是A類型的資料
當p指針指向派生類的時候,因為p是A類型的指針,是以*p隻解釋為A類型資料的長度,即
————————-|---------
|占一個int資料大小--|占一個Int資料大小--|
|從A中繼承而來------|-----(y資料)-------|
|------------------
|------------|------------|
|-p隻指向這個區域-|
是以,當基類的指針(P)指向派生類的時候,隻能操作派生類中從基類中繼承過來的資料和基類自身的資料。
而派生類指向基類的指針,因為記憶體空間比基類長,會導緻嚴重的後果,是以不允許派生類的指針指向基類,雖然通過強制轉換是可以編譯通過的,但這是極不安全的做法。
C++的多态性能解決基類指針不能操作派生類的資料成員的問題