// ============================================================================ // p1c04_07_02 — 4.7.2 派生类访问控制 // 来源:川大 C++/LinuxC wiki「02.Qt方向」 // 说明:本文件由 gen_part1.py 合并页面中的教学片段而成。每个片段用 // // --- 原文片段 [pageId:blockIdx] --- 标注出处。 // 已做最小修正(笔误/平台移植),详见 docs/ERRATA.md。 // ============================================================================ #include using namespace std; // --- 原文片段 [58954461:1] 4.7.2 派生类访问控制 --- //基类 class A{ public: int mA; protected: int mB; private: int mC; }; //1. 公有(public)继承 class B : public A{ public: void PrintB(){ cout << mA << endl; //可访问基类public属性 cout << mB << endl; //可访问基类protected属性 //cout << mC << endl; //不可访问基类private属性 } }; class SubB : public B{ void PrintSubB(){ cout << mA << endl; //可访问基类public属性 cout << mB << endl; //可访问基类protected属性 //cout << mC << endl; //不可访问基类private属性 } }; void test01(){ B b; cout << b.mA << endl; //可访问基类public属性 //cout << b.mB << endl; //不可访问基类protected属性 //cout << b.mC << endl; //不可访问基类private属性 } //2. 私有(private)继承 class C : private A{ public: void PrintC(){ cout << mA << endl; //可访问基类public属性 cout << mB << endl; //可访问基类protected属性 //cout << mC << endl; //不可访问基类private属性 } }; class SubC : public C{ void PrintSubC(){ //cout << mA << endl; //不可访问基类public属性 //cout << mB << endl; //不可访问基类protected属性 //cout << mC << endl; //不可访问基类private属性 } }; void test02(){ C c; //cout << c.mA << endl; //不可访问基类public属性 //cout << c.mB << endl; //不可访问基类protected属性 //cout << c.mC << endl; //不可访问基类private属性 } //3. 保护(protected)继承 class D : protected A{ public: void PrintD(){ cout << mA << endl; //可访问基类public属性 cout << mB << endl; //可访问基类protected属性 //cout << mC << endl; //不可访问基类private属性 } }; class SubD : public D{ void PrintD(){ cout << mA << endl; //可访问基类public属性 cout << mB << endl; //可访问基类protected属性 //cout << mC << endl; //不可访问基类private属性 } }; void test03(){ D d; //cout << d.mA << endl; //不可访问基类public属性 //cout << d.mB << endl; //不可访问基类protected属性 //cout << d.mC << endl; //不可访问基类private属性 } // --- main --- int main() { test01(); test02(); test03(); return 0; }