目标: 验证公用继承下基类的公用成员在派生类依然为公用成员

测试用程序代码:

#include <iostream>
using namespace std;

class A {
public:
int a1 = 10;
protected:
int a2 = 20;
public:
virtual void dsp() {
cout << "A : public a1 = " << a1 << ", protected a2 = " << a2 << endl;
}
};


class B : public A {
public:
int b1 = 30;
void seta2(int i) {
a2 = i;
}
void dsp() override {
cout << "B : public a1 = " << a1 << ", protected a2 = " << a2 << endl;
}
};


class C : public B {
public:
void dsp() override {
cout << "C : public a1 = " << a1 << ", protected a2 = " << a2 << ", public b1 = " << b1 << endl;
}

};

void Show(A& d, B& d1, C& d2) {
d.dsp(); d1.dsp(); d2.dsp();
cout << "----------------------" << endl;
}

int main() {
A d;
B d1;
C d2;
Show(d, d1, d2);
d1.a1 = 100;
Show(d, d1, d2);
d2.a1 = 200;
Show(d, d1, d2);
d1.seta2(300);
Show(d, d1, d2);
d2.seta2(400);
Show(d, d1, d2);
return 0;
}

出现现象:

输出:

A : public a1 =  10, protected a2 =  20
B : public a1 = 10, protected a2 = 20
C : public a1 = 10, protected a2 = 20, public b1 = 30
----------------------
A : public a1 = 10, protected a2 = 20
B : public a1 = 100, protected a2 = 20
C : public a1 = 10, protected a2 = 20, public b1 = 30
----------------------
A : public a1 = 10, protected a2 = 20
B : public a1 = 100, protected a2 = 20
C : public a1 = 200, protected a2 = 20, public b1 = 30
----------------------
A : public a1 = 10, protected a2 = 20
B : public a1 = 100, protected a2 = 300
C : public a1 = 200, protected a2 = 20, public b1 = 30
----------------------
A : public a1 = 10, protected a2 = 20
B : public a1 = 100, protected a2 = 300
C : public a1 = 200, protected a2 = 400, public b1 = 30
----------------------

分析:

  1. 初始化

    • 所有对象 (d, d1, d2) 的 a1 初始化为 10,a2 初始化为 20。d1d2 中的 b1 初始化为 30。

      输出:

      A : public a1 =  10, protected a2 =  20
      B : public a1 = 10, protected a2 = 20
      C : public a1 = 10, protected a2 = 20, public b1 = 30
      ----------------------
  2. 修改 d1.a1 为 100

    • 只影响 d1 对象

      输出:

      A : public a1 =  10, protected a2 =  20
      B : public a1 = 100, protected a2 = 20
      C : public a1 = 10, protected a2 = 20, public b1 = 30
      ----------------------
  3. 修改 d2.a1 为 200

    • 只影响 d2 对象

      输出:

      A : public a1 =  10, protected a2 =  20
      B : public a1 = 100, protected a2 = 20
      C : public a1 = 200, protected a2 = 20, public b1 = 30
      ----------------------
  4. 调用 d1.seta2(300)

    设置了 d1 对象中的 a2 值为 300。

    输出:

    A : public a1 =  10, protected a2 =  20
    B : public a1 = 100, protected a2 = 300
    C : public a1 = 200, protected a2 = 20, public b1 = 30
    ----------------------
  5. 调用d2.seta2(400)

    设置了 d2 对象中的 a2 值为 400。

    输出:

    A : public a1 =  10, protected a2 =  20
    B : public a1 = 100, protected a2 = 300
    C : public a1 = 200, protected a2 = 400, public b1 = 30
    ----------------------

结论:

  • 每个对象维护自己独立的成员变量(包括继承的变量)状态。
  • 受保护的成员虽然在类及其子类之间可以访问和修改,但它们的状态是在每个对象级别上独立管理的。