|
2 | 2 |
|
3 | 3 | // READ: 派生类 <https://zh.cppreference.com/w/cpp/language/derived_class>
|
4 | 4 |
|
5 |
| -// 三个类型的定义在下方,它们的关系是:B 派生自 A 并包含一个 X 类型的成员。 |
6 |
| - |
7 |
| -// ↓↓↓ 这是声明 |
8 |
| -struct X; |
9 |
| -struct A; |
10 |
| -struct B; |
11 |
| -// ↑↑↑ 这是声明 |
12 |
| - |
13 |
| -int main(int argc, char **argv) { |
14 |
| - X x = X(1); |
15 |
| - A a = A(2); |
16 |
| - B b = B(3); |
17 |
| - |
18 |
| - // TODO: 补全三个类型的大小 |
19 |
| - static_assert(sizeof(X) == ?, "There is an int in X"); |
20 |
| - static_assert(sizeof(A) == ?, "There is an int in A"); |
21 |
| - static_assert(sizeof(B) == ?, "B is an A with an X"); |
22 |
| - |
23 |
| - std::cout << std::endl |
24 |
| - << "-------------------------" << std::endl |
25 |
| - << std::endl; |
26 |
| - |
27 |
| - // 这是不可能的,A 无法提供 B 增加的成员变量的值 |
28 |
| - // B ba = A(4); |
29 |
| - |
30 |
| - // 这也是不可能的,因为 A 是 B 的一部分,就好像不可以把套娃🪆的外层放进内层里。 |
31 |
| - A ab = B(5);// 然而这个代码可以编译和运行! |
32 |
| - // THINK: 观察打印出的信息,推测把大象放进冰箱分几步? |
33 |
| - // THINK: 这样的代码是“安全”的吗? |
34 |
| - // NOTICE: 真实场景中不太可能出现这样的代码 |
35 |
| - |
36 |
| - return 0; |
37 |
| -} |
38 |
| - |
39 |
| -// ↓↓↓ 这是定义 |
40 |
| - |
41 | 5 | struct X {
|
42 | 6 | int x;
|
43 | 7 |
|
@@ -77,3 +41,29 @@ struct B : public A {
|
77 | 41 | std::cout << "~B(" << a << ", X(" << x.x << "))" << std::endl;
|
78 | 42 | }
|
79 | 43 | };
|
| 44 | + |
| 45 | +int main(int argc, char **argv) { |
| 46 | + X x = X(1); |
| 47 | + A a = A(2); |
| 48 | + B b = B(3); |
| 49 | + |
| 50 | + // TODO: 补全三个类型的大小 |
| 51 | + static_assert(sizeof(X) == ?, "There is an int in X"); |
| 52 | + static_assert(sizeof(A) == ?, "There is an int in A"); |
| 53 | + static_assert(sizeof(B) == ?, "B is an A with an X"); |
| 54 | + |
| 55 | + std::cout << std::endl |
| 56 | + << "-------------------------" << std::endl |
| 57 | + << std::endl; |
| 58 | + |
| 59 | + // 这是不可能的,A 无法提供 B 增加的成员变量的值 |
| 60 | + // B ba = A(4); |
| 61 | + |
| 62 | + // 这也是不可能的,因为 A 是 B 的一部分,就好像不可以把套娃🪆的外层放进内层里。 |
| 63 | + A ab = B(5);// 然而这个代码可以编译和运行! |
| 64 | + // THINK: 观察打印出的信息,推测把大象放进冰箱分几步? |
| 65 | + // THINK: 这样的代码是“安全”的吗? |
| 66 | + // NOTICE: 真实场景中不太可能出现这样的代码 |
| 67 | + |
| 68 | + return 0; |
| 69 | +} |
0 commit comments