关于经过引用来调用虚函数

关于通过引用来调用虚函数
#include < iostream >
using namespace std;

class Box
{
public:
Box(int, int, int);
virtual void show();
protected:
int length;
int breadth;
int longth;
};

class Carton : public Box
{
public:

Carton(int, int, int, int);
protected:
virtual void show();
int weight;
};

class Package : public Carton
{
public:
Package(int, int, int, int, char vname[30]);
virtual void show();
private:
char name[30];
};

void ashow(  Box& rBox)
{
rBox.show();
}[color=#000000]

[/color]
int main(void)
{
int  alength;
int  abreadth;
int  alongth;
int  aweight;
char aname[30];

cin >> alength >> abreadth >> alongth >> aweight >> aname;

Box mybox(alength, abreadth, alongth);
Carton mycarton(alength, abreadth, alongth, aweight);
Package package(alength, abreadth, alongth, aweight, aname);
mybox.show();
// mycarton.show();
package.show();
Box* pbox = &mycarton;
pbox->show();

Carton* acarton = &package;
// acarton->show();
ashow(package);
return 0;
}

Box::Box(int vlength, int vbreadth, int vlongth) : length(vlength), breadth(vbreadth), longth(vlongth)
{}

void Box::show()
{
cout << length << "  "
<< breadth << "  "
<< longth << endl;
}

Carton::Carton(int vlength, int vbreadth, int vlongth, int vweight) : Box(vlength, vbreadth, vlongth), weight(vweight)
{}

void Carton::show()
{
cout << length << "  "
<< breadth << "  "
<< longth << "  "
<< weight << endl;
}

Package::Package(int vlength, int vbreadth, int vlongth, int vweight, char vname[30]) : Carton(vlength, vbreadth, vlongth, vweight)
{
strcpy_s(name,20,vname);
}

void Package::show()
{
cout << length << "  "
<< breadth << "  "
<< longth << "  "
<< weight << "  "
<< name << endl;
}
为什么
void ashow(  Box& rBox)
{
rBox.show();
}
中void ashow(Box& rBox)不能写为void ashow(const Box& rBox)
在形参前加const就报错
错误 1 error C2662: “Box::show”: 不能将“this”指针从“const Box”转换为“Box &”
错误 2 IntelliSense: 对象包含与成员函数不兼容的类型限定符


------解决方案--------------------
引用:
#include < iostream >
using namespace std;

class Box
{
public:
Box(int, int, int);
virtual void show();
protected:
int length;
int breadth;
int longth;
};

class Carton : public Box
{
public:

Carton(int, int, int, int);
protected:
virtual void show();
int weight;
};

class Package : public Carton
{
public:
Package(int, int, int, int, char vname[30]);
virtual void show();
private:
char name[30];
};

void ashow(  Box& rBox)
{
rBox.show();
}[color=#000000]

[/color]
int main(void)
{
int  alength;
int  abreadth;
int  alongth;
int  aweight;
char aname[30];

cin >> alength >> abreadth >> alongth >> aweight >> aname;

Box mybox(alength, abreadth, alongth);
Carton mycarton(alength, abreadth, alongth, aweight);
Package package(alength, abreadth, alongth, aweight, aname);
mybox.show();
// mycarton.show();
package.show();
Box* pbox = &mycarton;
pbox->show();

Carton* acarton = &package;
// acarton->show();
ashow(package);
return 0;
}

Box::Box(int vlength, int vbreadth, int vlongth) : length(vlength), breadth(vbreadth), longth(vlongth)
{}

void Box::show()
{
cout << length << "  "
<< breadth << "  "
<< longth << endl;
}

Carton::Carton(int vlength, int vbreadth, int vlongth, int vweight) : Box(vlength, vbreadth, vlongth), weight(vweight)