三种继承类型
C++继承分为,公有继承、保护继承、私有继承,下面通过例子来分析下三种继承各自的特性。
首先我们先定义一个基类,此基类包含有三种成员,分别为公有成员,保护成员,私有成员。
class Parent
{
public:
void printPublic() { cout << "printPublic" << endl; }
protected:
void printProtected() { cout << "printProtected" << endl; }
private:
void printPrivate() { cout << "printPrivate" << endl; }
};
公有继承
下面我们定义一个子类,这个类通过公有继承实现。
class ChildPublic : public Parent
{
void Print()
{
printPublic();
printProtected();
// printPrivate(); // 此成员在基类是私有的,所以子类中无法调用
}
};
我们可以看到基类的公有成员和保护成员可以在子类的内部访问,但是私有成员在子类内部是无法访问的。再来看下公有继承下子类对象对于基类中成员的访问情况。
ChildPublic ch1;
ch1.printPublic();
// ch1.printProtected(); // 保护成员,不能访问
// ch1.printPrivate(); // 私有成员,不能访问
很显然,因为公有继承不改变类成员的成员属性,所以公有成员可通过子类的对象,保护成员和私有成员不能通过子类的对象访问。
保护继承
class ChildProtected : protected Parent
{
void Print()
{
printPublic();
printProtected();
// printPrivate(); // 此成员在基类是私有的,所以子类中无法调用
}
};
我们可以看到基类的公有成员和保护成员可以在子类的内部访问,但是私有成员在子类内部是无法访问的。和公有继承有相同的属性。再来看下保护继承下子类对象对于基类中成员的访问情况。
ChildProtected ch1;
// ch1.printPublic(); // 保护成员,不能访问
// ch1.printProtected(); // 保护成员,不能访问
// ch1.printPrivate(); // 私有成员,不能访问
可以看到,基类中的公有成员通过保护继承后,子类对象不能访问基类的公有成员了,因为通过保护继承规则,基类的公有成员的成员属性变成了保护属性了,基类原有的保护成员和私有成员通过保护继承则保持原来的成员属性不变。
私有继承
class ChildPrivate : private Parent
{
void Print()
{
printPublic();
printProtected();
// printPrivate(); // 此成员在基类是私有的,所以子类中无法调用
}
};
我们可以看到基类的公有成员和保护成员可以在子类的内部访问,但是私有成员在子类内部是无法访问的。和公有继承有相同的属性。再来看下私有继承下子类对象对于基类中成员的访问情况。
ChildPrivate ch1;
ch1.printPublic(); // 私有成员,不能访问
ch1.printProtected(); // 私有成员,不能访问
ch1.printPrivate(); // 私有成员,不能访问
可以看到,基类中的公有成员通过私有继承后,子类对象不能访问基类的私有成员了,因为通过私有继承规则,基类的公有成员和保护成员的成员属性变成了私有属性了,基类私有成员通过私有继承则保持原来的成员属性不变。
总结:
三种继承均有以下四个结论:
1、基类的公有成员可以在子类内部访问
2、基类的保护成员可以在子类内部访问
3、基类的私有成员不能在子类内部访问
4、基类成员能否通过子类对象访问,则要根据基类的成员通过三种继承后在子类中所表现出的成员属性,依照C++类成员可访问性的基本规则。