一个程序讲解C++中public,protected和private继承的问题
#include <iostream>
#include<assert.h>
using namespace std;
class A{
public:
int a;
A(){
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun(){
cout << a << endl; //正确,本类可以访问本类的pubil成员;
cout << a1 << endl; //正确,本类可以访问本类的pubil成员;
cout << a2 << endl; //正确,本类可以访问本类的protected成员,在类内部可以被访问,在类外部不能使用类的对象进行访问,需要使用类的pubilc成员函数进行访问;
cout << a3 << endl; //正确,本类可以访问本类的private成员,在类内部可以被访问,在类外部不能使用类的对象进行访问,需要使用类的pubilc成员函数进行访问;
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
class B : public A{
public:
int a;
B(int i){
A();
a = i;
}
void fun(){
cout << a << endl; //正确,本类的public成员,可以被本类调用;
cout << a1 << endl; //正确,基类的public成员,在派生类中仍是public成员。
cout << a2 << endl; //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。
//cout << a3 << endl; //错误,基类的private成员不能被派生类访问。
}
};
class C : protected A{
public:
int a;
C(int i){
A();
a = i;
}
void fun(){
cout << a << endl; //正确,本类的public成员,可以被本类使用
cout << a1 << endl; //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。
cout << a2 << endl; //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。
//cout << a3 << endl; //错误,基类的private成员不能被派生类访问。
}
};
class D : private A{
public:
int a;
D(int i){
A();
a = i;
}
void fun(){
cout << a << endl; //正确,本类的public成员,可以被本类使用
cout << a1 << endl; //正确,基类public成员,在派生类中变成了private,可以被派生类访问。
cout << a2 << endl; //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。
//cout << a3 << endl; //错误,基类的private成员不能被派生类访问。
}
};
int main()
{
B b(10);
cout << b.a << endl;
cout << b.a1 << endl; //正确,public成员可以被类的对象调用
// cout << b.a2 << endl; //错误,类外不能通过对象访问protected成员
// cout << b.a3 << endl; //错误,基类的private成员不能被派生类访问
C c(10);
cout << c.a << endl; //正确。public成员可以被类的对象调用
//cout << c.a1 << endl; //错误,类外不能通过对象访问protected成员
//cout << c.a2 << endl; //错误,类外不能通过对象访问protected成员
//cout << c.a3 << endl; //错误,基类的private成员不能被派生类访问
D d(10);
cout << d.a << endl; //正确。public成员可以被类的对象调用
//cout << d.a1 << endl; //错误,类外不能通过对象访问private成员
//cout << d.a2 << endl; //错误, 类外不能通过对象访问private成员
//cout << d.a3 << endl; //错误,基类的private成员不能被派生类访问
return 0;
}
总结:
继承中的特点:
类的继承有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
1.public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
2.protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private
3.private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private
除public成员以外,其他的成员都不能用类的对象进行调用(在类外被调用),但是其他成员可以通过定义在pubilc区域的内的成员函数进行调用。
需要注意的一点是,基类(即父类)的private成员,无论在继承类内还是外,都无法被访问。