#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;
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++的多态性能解决基类指针不能操作派生类的数据成员的问题