先思考一个问题,来引出本文的主要内容

class A是基类,class B是A的子类,那么请看下面的语句     A*  a = new B();   此时指针a的类型是B还是A?

        一直以来,我都认为铁定是B,我一直认为出现了类型转换,但直到今天才知道,这个想法是错误的。


       看代码

#include<iostream>
using namespace std;
class BaseA
{
public:
void print()
{
cout<<"A"<<endl;
}
void test()
{
cout<<"aa"<<endl;
}
};
class BaseB:public BaseA
{
private:
void print()
{
cout<<"b"<<endl;
}
void test()
{
cout<<"bb"<<endl;
}
};


int main(int argc, char* argv[])
{
BaseA *p = new BaseB();
cout<<typeid(*p).name()<<endl;
p->print();
p->test();
return 1;
}


运行出来的结果让我大吃一惊,指针的类型是BaseA,而不是我以为的BaseB.


为什么没有出现我想象中的类型转换呢?我只能做出这样的推测,之所以不转换,是因为不需要转换,因为不涉及任何的多态,转换反而是错误的。

修改一下代码,将BaseA的print方法改为 virtual

#include<iostream>
using namespace std;
class BaseA
{
public:
virtual void print()
{
cout<<"A"<<endl;
}
void test()
{
cout<<"aa"<<endl;
}
};
class BaseB:public BaseA
{
private:
void print()
{
cout<<"b"<<endl;
}
void test()
{
cout<<"bb"<<endl;
}
};


再次执行main