关于私有继承的一个问题
最近研究私有继承,书上说私有继承的情况下,子类的指针或者索引,必须通过显示转化的方式,才能向上类型转化成父类的指针或者索引. 所以我写了个测试,在VS2005上进行演示,发现一些问题,百思不得其解.
代码:
class Test
{
};
class TestPublic : public Test
{
};
class TestPrivate : private Test
{
public:
void setA(TestPrivate *test)
{Test *a=test;}; //问题1, 为什么在子类的方法中,向上类型转化不需要显示?
void setB(TestPrivate test)
{Test b=test;};
void setC(TestPrivate test)
{Test& c=test;};
};
TestPublic testPublic; //先验证public继承下,向上类型转化的情况
Test A = testPublic; //成功,这边其实是验证Test的默认拷贝构造函数Test(const Test&)中会发生的向上类型转化
Test& B = testPublic; //成功
Test* C = &testPublic; //成功
TestPrivate testPrivate; //验证public继承下,隐式向上类型转化的情况
Test A = testPrivate; //失败
Test& B = testPrivate; //失败
Test* C = &testPrivate; //失败
TestPrivate testPrivate; //验证public继承下,显示向上类型转化的情况
Test A = (Test&)testPrivate; //成功
Test& B = (Test&)testPrivate; //成功, 这个验证了书上的说法是正确的,必须显示转化
Test* C = (Test*)&testPrivate; //成功
所以问题总结如下
1) 私有继承下, 子类的方法中向上类型转化是不要显示的,但在外部必须是显示的,这是为什么?