题目要求
补充下列代码,使得程序的输出为:
A:3
A:15
B:5
3
15
5
类和函数接口定义:
参见裁判测试程序样例中的类和函数接口。
裁判测试程序样例:
#include <iostream> using namespace std; class CMyClassA { int val; public: CMyClassA(int); void virtual print(); }; CMyClassA::CMyClassA(int arg) { val = arg; printf("A:%d\n", val); } void CMyClassA::print() { printf("%d\n", val); return; } /* 在这里填写代码 */ int main(int argc, char** argv) { CMyClassA a(3), *ptr; CMyClassB b(5); ptr = &a; ptr->print(); a = b; a.print(); ptr = &b; ptr->print(); return 0; }
输入样例:
None
输出样例:
A:3
A:15
B:5
3
15
5
解题思路
使用 CMyClassB 继承 CMyClassA,并根据要求添加 val2 成员表示 b 的另一个值。
在构造函数中,调用基类的构造函数,并根据参数计算出新的 val 值和 val2 值。
作为重载函数,print 函数输出 b 的 val2 值。
代码
class CMyClassB : public CMyClassA { public: int val2; CMyClassB(int x): CMyClassA(3 * x), val2(x) { printf("B:%d\n", val2); } void print() override { printf("%d\n", val2); } };
整体代码如下:
#include <iostream> using namespace std; // 基类 CMyClassA class CMyClassA { int val; // 定义私有成员变量 public: CMyClassA(int); // 声明构造函数 void virtual print(); // 声明虚函数 }; // 基类 CMyClassA 的构造函数实现 CMyClassA::CMyClassA(int arg) { val = arg; printf("A:%d\n", val); // 输出 A:val } // 基类 CMyClassA 的虚函数实现 void CMyClassA::print() { printf("%d\n", val); // 输出 val } // 派生类 CMyClassB class CMyClassB : public CMyClassA { public: int val2; // 定义新的成员变量 // 构造函数 CMyClassB(int x): CMyClassA(3 * x), val2(x) { printf("B:%d\n", val2); // 输出 B:val2 } // 重载虚函数 print void print() override { printf("%d\n", val2); // 输出 val2 } }; int main(int argc, char** argv) { // 创建对象 a CMyClassA a(3), *ptr; // 创建对象 b CMyClassB b(5); // ptr 指向对象 a ptr = &a; // 输出 a.val ptr->print(); // 将 b 赋值给 a a = b; // 输出 a.val a.print(); // ptr 指向对象 b ptr = &b; // 输出 b.val2 ptr->print(); return 0; }
总结
该题考察继承和多态机制,需要掌握以下知识点:
- 在基类中声明虚函数并使用
virtual
关键字,在派生类中重载虚函数并使用override
关键字 - 实例化对象并使用指针来访问成员函数
- 将派生类对象赋值给基类对象
我是秋说,我们下次见。