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

我是秋说,我们下次见。

目录
相关文章
|
23天前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
54 2
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3
|
3月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
50 2
|
3月前
|
编译器 C++ 索引
C++虚拟成员-虚函数
C++虚拟成员-虚函数
|
3月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
36 1
|
3月前
|
存储 编译器 C++
C++多态实现的原理:深入探索与实战应用
【8月更文挑战第21天】在C++的浩瀚宇宙中,多态性(Polymorphism)无疑是一颗璀璨的星辰,它赋予了程序高度的灵活性和可扩展性。多态允许我们通过基类指针或引用来调用派生类的成员函数,而具体调用哪个函数则取决于指针或引用所指向的对象的实际类型。本文将深入探讨C++多态实现的原理,并结合工作学习中的实际案例,分享其技术干货。
74 0
|
3月前
|
JSON Android开发 C++
Android c++ core guideline checker 应用
Android c++ core guideline checker 应用
|
8天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
35 4
|
9天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
33 4