觀察下邊一段代碼:
class A{
public:
void f1(){}
int i;
protected:
void f2(){}
int j;
private:
int k;
};
class B:public A{
public:
void f3(){}
protected:
int m;
private:
int n;
};
class C:public B{
public:
void f4(){}
private:
int p;
};
全是公用繼承,思考這樣幾個問題:
1.在main函數中能否用b1.i,b1.j和b1.k引用派生類B對象b1中基類A的成員
2.派生類B中成員函數能否調用基類中的成員函數f1和f2.
3.派生類B中成員函數能否調用基類中的資料成員i,j,k.
4.能否在main函數中用c1.i,c1.j,c1.k,c1.m.cl.n,c1.p引用基類A的成員i,j,k,派生類B的成員m,n以及派生類C的成員p
5.能否在main函數中用c1.f1(),c1.f2(),c1.f3()和c1.f4()調用f1,f2,f3,f4c成員函數.
6.派生類C的成員函數f4能否調用基類A中的成員函數f1,f2和派生類中的成員函數f3.
答案在代碼中,思考幾分鐘再看.
#include<bits/stdc++.h>
using namespace std;
class A {
public:
void f1(){}//空函數得寫括号
int i;
protected:
void f2(){}//空函數得寫括号
int j;
private:
int k;
};
class B:public A {
public:
void f3() {
//f1();
// f2();f1在B類中是公有,f2是保護,可以直接在其派生類中調用
// i = 1;//可以
// j = 1;//可以
// k = 1; //可以
}
protected:
int m;
private:
int n;
};
class C:public B {
public:
void f4(){
f1();//可以
f2();//可以
}
private:
int p;
};
int main() {
A a1;
B b1;
C c1;
b1.i; //可以通路;
//b1.j; //不可以通路,j是由通過公有繼承基類來的,j在 基類中的權限是保護,在派生類中也是保護,類外不能通路被保護的資料成員。
//b1.k;//k同理;
// c1.j; //不可以
// c1.f1();//可以
c1.f3();//可以
c1.f4();//可以
// c1.f2(); //不可以f2是保護成員
c1.i;//可以
// c1.j;//不可以
// c1.k;//不可以
// c1.n;//不可以
// c1.m; //不可以
return 0;
}