您的位置:首页 > 其它

也谈virtual

2015-10-17 14:07 288 查看
先思考一个问题,来引出本文的主要内容

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: