C++学习10向上造型和多态性(1)
{
public: int I;
A():i(10){}
};
class B:public A{};
int main(){
A a;
B b;
cout<<a.i<<” ”<<b.i<<endl;
cout<<sizeof(a)<<” “<<sizeof(b)<<end;;
int * p=(int*)&a;
cout<<p<<” “<<*p<<endl;
*p=20;
cout<<a.i<<endl;
p=(int*)&b;
cout<<p<<” ”<<*p<<endl;
return 0;
}
输出:
10 10
4 4
0xxxx 10
20
0xxxx 10
---------------------
class A
{
public: int I;
A():i(10){}
};
class B:public A
{
private: int j;
public:
B:j(30){}
public:
void f(){
cout<<”B.j=”j<<endl;
}
};
int main(){
A a;
B b;
cout<<a.i<<” ”<<b.i<<endl;
cout<<sizeof(a)<<” “<<sizeof(b)<<end;;
int * p=(int*)&a;
cout<<p<<” “<<*p<<endl;
*p=20;
cout<<a.i<<endl;
p=(int*)&b;
cout<<p<<” ”<<*p<<endl;
p++;
*p=50;
return 0;
}
输出
10 10(这里还是i的值)
4 8(size会变)
0xxxx 10
20
0xxxx 10
B,j=50;
子类有指针就可以访问了父类的
upcasting:子类当成父类来用(向上造型,造型:数据没丢,只是当父类看了)
eg:
manager pete(“pete”,”444-555”,”bakery”);
Employee*ep=&pete;//upcast
Employee&er=pete;//upcast
此时ep就当基类来用了
--------------------------
多态性
圆形、椭圆形、矩形
shape类,可以派生出各种类
virtual有,则子类和父类的同名函数有关系。
render定义一个shape类型的指针
指针的对象去做render,所以render是个通用函数,对任何shape类的子类都是适用的
virtual类型的函数表面,这个函数在使用的时候才知道是什么类型的对象。
在func中render(&ell)是调用ell的render
render(&circ)是调用circle的render
这里p是多态的
p指的是谁,就是谁的形态
多态性是建立在upcast的基础上(但要有virtual)
dynamicbinding动态绑定:该调用哪个函数是运行的是才知道的。
p的类型是shape*(静态类型)
p当时指的类型是动态的