关于C++父类子类指针替换问题

来源:百度知道 编辑:UC知道 时间:2024/06/18 01:48:39
首先有一个父类:

class A
{
public: int An;
virtual int getit(){return 0;} <1>
};

它有一个子类:
class B: public A
{
public: int Bn;
int getit(){return 1;}
};

然后有一个结构:
struct M
{
A *per;
M *next;
};

之后的主函数:
void main()
{
p=new M; //生成一个指针指向结构

p->per=new B; // <2> 用子类指针覆盖父类指针
p->per->An=0; // <3> 调用父类
cout<<( p->per->getit() )<<endl; //<4> 调用子类函数
p->per->Bn=0; // <5> 调用子类参量

}

在编译过程中,会给语句 <5> 报错;如果删去<5>程序正常.
如果删去类A的语句<1>, 编译会给<4>报错

我的问题是: 一定要用子类指针附到per上面去的话,应该用什么形式的语法呢?
望高人指出我这个哪里错了...

p->per->Bn=0; // <5> 调用子类参量
改成
((B*)(p->per))->Bn=0;

p->per的类型是A*,class A的成员里就没有Bn,这样编译当然通不过
要通过的话可以动态类型转换为B*。不过最好还是通过虚拟函数来访问成员,就可以避免类型转换了
B *pb = dynamic_cast<B*>(p->per);
if (pb)
pb->Bn = 0;