首页 > 编程语言 >[C++/PTA] 虚函数的应用

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

时间:2023-06-14 19:45:00浏览次数:43  
标签:函数 val int CMyClassA C++ PTA print val2 ptr

题目要求

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

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

我是秋说,我们下次见。

标签:函数,val,int,CMyClassA,C++,PTA,print,val2,ptr
From: https://www.cnblogs.com/qiushuo/p/17481203.html

相关文章

  • [C++/PTA] 学生成绩快速录入
    题目要求现在需要录入一批学生的成绩(学号,成绩)。其中学号是正整数,并且录入时,后录入学生的学号会比前面的学号大;成绩分两等,通过(Pass,录入时用1代表),不通过(Fail,录入时用0代表)。由于很多学号都是相邻的,并且学号相邻的学生成绩常常相同。所以在录入时,适当地加了速。如果当前学生......
  • [C++/PTA] 我的支付宝和余额宝
    题目要求支付宝AliPay和余额宝AliFund是一对好兄弟,他们来自同一个父类Account。已知类Account是支付宝AliPay和余额宝AliFund的虚基类,包括两个protected成员数据:longID;//账号stringname;//用户名支付宝AliPay是类Account的保护派生类,包括两个新增protected成员数据:double......
  • python装饰器函数学习笔记
    函数也是一个对象,并且这个对象可以被赋值给变量,所以,我们可以通过变量调用该函数defnow():...print('2015-3-25')...f=nowf()2015-3-25函数对象有一个__name__属性,可以拿到函数名字:now.name'now'f.name'now'现在如果我们要增强now()函数的功能,比如,在......
  • python返回函数学习笔记
    内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力deflazy_sum(*args):defsum():ax=0forninargs:ax=ax+nreturnaxreturn......
  • 关于函数指针的一些问题小结
    最近接到一个需求,使用sdk提供的消息回调,一般我们是继承sdk的消息类,然后sdk的消息回调(虚函数)会在有消息的时候调用回调指针,从而触发回调不过因为sdk那边又对该消息类二次封装了并提供了一些接口,所以在研究二次封装的方法时,遇到了一些有意思的问题,故记录下typedefvoid(_......
  • MATLAB技巧——sort和sortrows函数
    1、sort函数sort函数用于对数据进行排序,通过helpsort命令,可以查找到sort函数的具体用法:Y=SORT(X,DIM,MODE)hastwooptionalparameters.DIMselectsadimensionalongwhichtosort.MODEselectsthedirectionofthesort'ascend'resultsinascendingorder......
  • C/C++中的变长结构体
    1.问题来源首先看下如下的一段代码:#include<stdlib.h>#include<stdio.h>#include<string.h>#defineMAX_LEN1024typedefstructKDtree{doubledata[MAX_LEN];//数据intdim;//选择的维度structKDtree*left;//左子树structKDtree*right;......
  • C/C++——排序
    在C/C++中的排序,使用到的函数主要有:sort()qsort()下面详细分析sort()函数和qsort()函数。1、sort()函数sort()是STL中提供的算法,头文件为:#include<algorithm>usingnamespacestd;函数原型如下:template<classRandomAccessIterator>voidsort(RandomAccessIteratorfirst,Ran......
  • C/C++——map的基本操作总结
    标准库map类型是一种以键-值(key-value)存储的数据类型。以下分别从以下的几个方面总结:map对象的定义和初始化map对象的基本操作,主要包括添加元素,遍历等1、pair类型1.1、pair类型的定义和初始化pair类型是在有文件utility中定义的,pair类型包含了两个数据值,通常有以下的一些定义和初......
  • C/C++——vector的基本操作总结
    标准库vector类型是C++中使用较多的一种类模板,vector类型相当于一种动态的容器,在vector中主要有一些基本的操作,接下来分别从以下的几个方面总结:vector对象的定义和初始化vector对象的基本操作,主要包括添加元素,遍历等1、vector对象的定义和初始化在vector中主要有四种定义和初始化的......