[C++/PTA] 虚函数的应用

简介: [C++/PTA] 虚函数的应用

题目要求

补充下列代码,使得程序的输出为:

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 关键字
  • 实例化对象并使用指针来访问成员函数
  • 将派生类对象赋值给基类对象

我是秋说,我们下次见。

目录
相关文章
|
2月前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
2月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
83 2
|
3月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
31 3
|
4月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
57 2
|
4月前
|
编译器 C++ 索引
C++虚拟成员-虚函数
C++虚拟成员-虚函数
|
4月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
42 1
|
4月前
|
JSON Android开发 C++
Android c++ core guideline checker 应用
Android c++ core guideline checker 应用
|
6月前
|
关系型数据库 MySQL 测试技术
技术分享:深入C++时间操作函数的应用与实践
技术分享:深入C++时间操作函数的应用与实践
62 1
|
28天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
103 5