测试代码如下,分析见注释
#include <iostream>
using namespace std;
class Base
{
private:
int m_private;
public:
int m_public;
protected:
int m_protectd;
};
class PublicChild : public Base //在公有继承中,父类中除了私有的成员变量及成员函数,其他的成员变量均可在子类中调用
{
public:
int testPublic() //ok
{
return m_public;
}
int testProtect() //ok
{
return m_protectd;
}
//int testPrivate() //erro
//{
// return m_private;
//
};
class ProtectedChild : protected Base//在保护继承中,父类中除了私有的成员变量及成员函数,其他的成员变量均可在子类中调用
{
public:
int testPublic() //ok
{
return m_public;
}
int testProtected() //ok
{
return m_protectd;
}
//int testPrivate()
//{
// return m_private;
//}
};
class PriavteChild : private Base//在私有继承中,父类中除了私有的成员变量及成员函数,其他的成员变量均可在子类中调用
{
public:
int testPublic() //ok
{
return m_public;
}
int testProtected() //ok
{
return m_protectd;
}
//int testPriavte()
//{
// return m_private;
//}
};
class ProtectedPublicChild : public ProtectedChild
{
public:
int testPublic() //ok
{
return m_public;
}
int testProtected() //ok
{
return m_protectd;
}
//int testPrivate() //erro
//{
// return m_private;
//}
};
class PrivatePublicChild : public PriavteChild
{
public:
//int testPublic() //erro
//{
// return m_public;
//}
//int testProtected() //erro
//{
// return m_protectd;
//}
//int testPrivate() //erro
//{
// return m_private;
//}
};
int main()
{
int a;
PublicChild publicChild; //在公有继承中,派生类的对象中的父类成员的可见性与普通类的对象中成员的可见性相同。public可见,其他的都不可见
a = publicChild.m_public; //ok
//a = publicChild.m_protectd; //erro
//a = publicChild.m_private; //erro
//私有继承和保护继承的区别在于派生类的子类对祖父类成员的是否可以使用
ProtectedChild protectedChild; //在保护继承中,派生类的对象中的附录成员的可见性均为不可见,父类中的public,protected成员变成了protected。也就是该保护派生类的公有派生类的成员函数可以访问祖父类中的public,protected成员
//a = protectedChild.m_public; //erro
//a = protectedChild.m_protectd; //erro
//a = protectedChild.m_private; //erro
PriavteChild privateChild; //在私有继承中,派生类的对象中的附录成员的可见性均为不可见,父类中的所有成员变量及函数(除了父类中的private成员),都可以理解变成了子类的private成员。所以子类的派生类成员函数无法访问祖父类中的任何成员
//a = privateChild.m_public; //erro
//a = privateChild.m_protectd; //erro
//a = privateChild.m_private; //erro
}