1、公有、私有和受保护继承
如果一个类的成员被定义成该类的私有成员,那么只有基类的成员和友元可以访问类中的私有成员。同时派生类也无法访问基类的私有成员,派生类的实例对象也无法访问这些私有成员。如果派生类为公有继承,基类成员保持自己的访问级别:基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。如果是受保护成员,基类的public和protected成员在派生类中为protected成员。如果是私有继承,基类中的所有成员在派生类中为private成员。
对于私有和保护继承,派生类中的函数成员可以调用基类中的数据成员(但是基类中的所有成员在派生类中都是私有的),派生类实例后的对象是无法访问基类中的那些成员的。
class fruit
{
public:
fruit() :name(""),quality(100) {}
~fruit() {}
void print()
{
cout << "This is fruit!" << endl;
}
protected:
string name;
private:
int quality;
};
class Apple :private fruit
{
public:
Apple() {}
~Apple() {}
void setName()
{
name = "Apple";
}
void print()
{
cout << name << endl;
}
};
int main()
{ Apple apple;
apple.setName();
apple.print();
apple.name = "pear";//这样使用时错误的,就像任何类的私有成员是不能在类外直接进行访问的。
return 0;
}
如果想要使用基类中的数据成员的话,可以在public后面加上using fruit::name;
class Apple :private fruit
{
public:
Apple() {}
~Apple() {}
using fruit::name;
void setName()
{
name = "Apple";
}
void print()
{
cout << name << endl;
}
};
int main()
{Apple apple;
apple.setName();
apple.print();
apple.name = "pear";
cout << apple.name << endl;
return 0;
}
2、基类和派生类的转换
可以使用派生类的对象给基类的对象进行初始化操作。也存在从派生类型引用到基类类型引用的自动转换,即,可以将派生类对象的引用转换为基类子对象的引用,对指针也类似。但是没有从派生类对象到基类对象的直接转换。
如果是public继承,则用户可以将派生类转换成基类。但是如果派生类是private或protected继承派生的,则无法将派生类对象转换成基类对象。private继承的话,派生类无法转换成基类。protected继承,则派生类的成员可以转换成基类类型。
Apple bigApple;
fruit apple2 = bigApple;//这里的转换就是错误的。由上面的代码可知Apple私有继承fruit,所以无法将派生类直接转换成基类。