前言
探究为什么Object类型的成员变量最好声明为指针呢?
假如成员变量不声明为指针,会发生什么情况?
第一步:准备
- 准备两个类,一个基类Base,和一个派生类A,并在基类中定义一个成员函数,派生类A重写它。
- 准备一个main函数,通过多态方法调用这个函数
class Base{
public:
Base(){};
virtual ~Base(){};
virtual void call(){
cout << "Base call ......."<<endl;
}
}
class A: public Base
{
public:
A(){};
~A(){};
void call(){
cout << "Acall ......."<<endl;
}
}
第二步:测试
int main(){
//test1
Base a1 = (Base)A;
a1.call();
//test2
Base* a2 = new A();
a2.call();
return 0;
}
第三步:测试结果
分析与总结
通过上面的结果可以发现,test1方式调不到自己重写的方法,test2方式可以调到,这是因为,test1是静态绑定,test2是动态绑定。动态绑定的前提有3个:
- 对象必须是指针类型
- 调用的函数是虚函数
- 向上转型(即基类指针指向子类对象)