類的三種繼承方式可訪問性和友元函式.cpp
阿新 • • 發佈:2019-01-10
/*類的三種繼承方式可訪問性和友元函式
*/
# include <iostream>
using namespace std;
class A
{
friend int get(const A& a);//宣告該函式為A的友元函式,使之可以在外部訪問A,友元函式也可以繼承
public:
A():x_(11),y_(22),z_(33){}
int& getx()
{
return x_; //直接訪問共有部分
}
int& gety()
{
return y_;//直接訪問受保護部分
}
int& getz()
{
return z_;//直接訪問私有部分
}
public:
int x_;//共有
protected:
int y_;//受保護
private:
int z_;//私有
};
class B:public A //公有繼承
{
public:
B(){}
int& getx()
{
return A::x_; //派生類可直接訪問公有部分
}
int& gety()
{
return A::y_;//派生類可直接訪問受保護部分
}
int& getz()
{
A::getz();//只能通過呼叫基類的公有部分函式來訪問基類私有部分,不能直接訪問
}
};
class C:protected A
{
public:
C(){}
int& getx()
{
return A::x_;
}
int& gety()
{
return A::y_;
}
int& getz()
{
A::getz();//受保護繼承的私有部分不能直接訪問
}
};
class D:private A //私有繼承
{
public:
D(){}
int& getx()
{
return A::x_;
}
int& gety()
{
return A::y_;
}
int& getz()
{
A::getz();//私有繼承的私有部分不能直接訪問
}
};
int get(const A& a) //友元函式可以在類外直接訪問所有內容
{
cout << a.x_ << endl;
cout << a.y_ << endl;
cout << a.z_ << endl;
};
int main()
{
B b;
cout << "***********"<<endl;
cout << "公有繼承" << endl;
cout << b.A::x_ << endl; //外部可直接訪問公有繼承的公有部分
cout << b.gety()<< endl;
cout << b.getz()<< endl;
cout << "***********"<<endl;
C c;
cout << "受保護繼承" << endl;
cout << c.getx()<< endl;
cout << c.gety()<< endl;
cout << c.getz()<< endl;
cout << "***********"<<endl;
D d;
cout << "私有繼承" << endl;
cout << d.getx()<< endl;
cout << d.gety()<< endl;
cout << d.getz()<< endl;
cout << "***********"<<endl;
cout << "a友元函式" << endl;
A a;
get(a);
cout << "***********"<<endl;
cout << "b友元函式" << endl;
get(b);
cout << "***********"<<endl;
}
/*
public --> 3 級 == 外部內部都可訪問
protected --> 2 級 == 外部不可訪問, 內部可訪問
private --> 1 級 == 外部不可訪問, 內部可訪問
不可訪問 --> 0 級 == 外部內部都不可訪問
*/
*/
# include <iostream>
using namespace std;
class A
{
friend int get(const A& a);//宣告該函式為A的友元函式,使之可以在外部訪問A,友元函式也可以繼承
public:
A():x_(11),y_(22),z_(33){}
int& getx()
{
return x_; //直接訪問共有部分
}
int& gety()
{
return y_;//直接訪問受保護部分
}
int& getz()
{
return z_;//直接訪問私有部分
}
public:
int x_;//共有
protected:
int y_;//受保護
private:
int z_;//私有
};
class B:public A //公有繼承
{
public:
B(){}
int& getx()
{
return A::x_; //派生類可直接訪問公有部分
}
int& gety()
{
return A::y_;//派生類可直接訪問受保護部分
}
int& getz()
{
A::getz();//只能通過呼叫基類的公有部分函式來訪問基類私有部分,不能直接訪問
}
};
class C:protected A
{
public:
C(){}
int& getx()
{
return A::x_;
}
int& gety()
{
return A::y_;
}
int& getz()
{
A::getz();//受保護繼承的私有部分不能直接訪問
}
};
class D:private A //私有繼承
{
public:
D(){}
int& getx()
{
return A::x_;
}
int& gety()
{
return A::y_;
}
int& getz()
{
A::getz();//私有繼承的私有部分不能直接訪問
}
};
int get(const A& a) //友元函式可以在類外直接訪問所有內容
{
cout << a.x_ << endl;
cout << a.y_ << endl;
cout << a.z_ << endl;
};
int main()
{
B b;
cout << "***********"<<endl;
cout << "公有繼承" << endl;
cout << b.A::x_ << endl; //外部可直接訪問公有繼承的公有部分
cout << b.gety()<< endl;
cout << b.getz()<< endl;
cout << "***********"<<endl;
C c;
cout << "受保護繼承" << endl;
cout << c.getx()<< endl;
cout << c.gety()<< endl;
cout << c.getz()<< endl;
cout << "***********"<<endl;
D d;
cout << "私有繼承" << endl;
cout << d.getx()<< endl;
cout << d.gety()<< endl;
cout << d.getz()<< endl;
cout << "***********"<<endl;
cout << "a友元函式" << endl;
A a;
get(a);
cout << "***********"<<endl;
cout << "b友元函式" << endl;
get(b);
cout << "***********"<<endl;
}
/*
public --> 3 級 == 外部內部都可訪問
protected --> 2 級 == 外部不可訪問, 內部可訪問
private --> 1 級 == 外部不可訪問, 內部可訪問
不可訪問 --> 0 級 == 外部內部都不可訪問
*/