头歌——C++实验12 多态(2024)

第1关:客观题

  • 1、

    多态是指:C

    A、

    一个类可以派生出多个特殊类

    B、

    一个类可以有多个父类

    C、

    针对同一消息,不同对象可以以适合自身的方式加以响应

    D、

    一个对象可以由多个其他对象组合而成

  • 2、

    如果一个类中至少有一个纯虚函数,则该类成为▁▁▁。

    填空1答案:抽象类

  • 3、

    纯虚函数的声明格式为:▁▁▁ 函数类型 函数名(参数表)=▁▁▁。

    填空1答案:virtual

    填空2答案:0

  • 4、

    虚函数与普通函数的区别就是声明时多了一个关键字▁▁▁。

    填空1答案:virtual

  • 5、

    C++面向对象的三大属性为:ABC

    A、

    封装

    B、

    继承

    C、

    多态

    D、

    重用

  • 6、

    派生类实现纯虚函数的参数与父类纯虚函数声明的参数可以不同。

    错误

  • 7、

    虚函数的作用是用来实现多态。

    正确

  • 8、

    抽象类可以有实例对象。

    错误

  • 9、

    C++运行时的多态(动态多态)主要通过( )来实现。ABCD

    A、

    虚函数

    B、

    继承

    C、

    指针

    D、

    引用

  • 10、

    下面程序的输出结果为:B

    
    
    1. #include <iostream>
    2. using namespace std;
    3. class A
    4. {
    5. public:
    6. virtual void f()
    7. {
    8. cout<<"A::f()"<<endl;
    9. }
    10. };
    11. class B : public A
    12. {
    13. private:
    14. virtual void f()
    15. {
    16. cout<<"B::f()"<<endl;
    17. }
    18. };
    19. int main()
    20. {
    21. A* pa = (A*)new B;
    22. pa->f();
    23. }
    A、

    A::f()

    B、

    B::f()

    C、

    编译错误

    D、

    不输出

第2关:请验证“使用虚函数”实例。

任务 请验证“使用虚函数”实例。

#include <iostream>
using namespace std;

class Pet 
{
public:
	/**********  Begin  **********/
	virtual void speak(){
        cout <<"how does a pet speak?\n";
    }
	
    /**********  End  **********/
};

/**********  Begin  **********/
class Cat : public Pet{
    public:
    void speak(){
        cout<<"miao~~!miao~~!\n";
    }
};
class Dog: public Pet{
    public :
    void speak(){
        cout <<"wang~~!wang~~!\n";
    }
};
	
/**********  End  **********/

int main() 
{
	/**********  Begin  **********/
	Pet *p1,*p2,obj;
    Dog dog1;
    Cat cat1;
    obj =dog1;
    obj.speak();
    p1=&cat1;
    p1->speak();
    p2=new Dog;
    p2->speak();
	
    /**********  End  **********/
	
	return 0;
}

第3关:请验证“纯虚函数和抽象类”实例。

任务 请验证“纯虚函数和抽象类”实例。

输入 无

预期输出

78.5398

30

#include <iostream>
using namespace std;

const double PI=3.1415926;

class Shape2D //Shape2D抽象类
{ 
public:
	/**********  Begin  **********/
	Shape2D(double x,double y):BaseX(x),BaseY(y){}
    virtual double Area()=0;
	
	/**********  End  **********/
protected:
	double BaseX,BaseY;
};

/**********  Begin  **********/
	class Circle:public Shape2D{
        public :
        Circle(double x,double y,double r) : Shape2D(x,y), radius(r){}
        double Area(){
            return PI*radius*radius;
        }
        private :
        double radius;
    };
class Rectangle:public Shape2D{
    public:
    Rectangle(double x,double y,double l,double w):Shape2D(x,y),Length(l),Width(w){}
    double Area(){
        return (Length-BaseX)*(Width-BaseY);
    }
   private :
    double Length,Width;
};

	
/**********  End  **********/

int main() 
{
	//求圆的面积 
	/**********  Begin  **********/
	Circle cir(1.0,1.0,5.0);
    double s1=cir.Area();
    cout<<s1<<endl;
	
	/**********  End  **********/
	
	//求矩形的面积
	/**********  Begin  **********/
	Rectangle rect(2.0,0.0,6.0,7.5);
    double s2 = rect.Area();
    cout<<s2<<endl;
	
	/**********  End  **********/
	
	return 0;
}

第4关:使用继承和多态实现整数计算器。

1、创建Operation父类: 具有2个私有整型数据成员:numA和numB 具有4个公有成员函数: 构造函数用于初始化数据成员,getNumA()和getNumB()用于获取数据成员的值,result()用于返回计算结果,设计为纯虚函数,且返回值类型为double。

2、创建4个派生类: Add类,Sub类,Mul类,Div类,分别用于完成加减乘除四则运算。除构造函数外,每个类需实现result()函数。在相除操作时需判断除数是否为0。

3、主函数: 创建1个父类型的指针,并分别用四个子类对其赋值,并调用result()方法。

输入1: 3 0 输出1: Add result is 3 Sub result is 3 Mul result is 0 Div result is division is 0

输入2: 10 20 输出2: Add result is 30 Sub result is -10 Mul result is 200 Div result is 0.5

#include <iostream>
#include <exception>
using namespace std;

class Operation {
public:
    // 构造函数
    Operation(int a, int b) : numA(a), numB(b) {}

    // 获取numA的值
    int getNumA() const {
        return numA;
    }

    // 获取numB的值
    int getNumB() const {
        return numB;
    }

    // 纯虚函数
    virtual double result() const = 0;

protected:
    int numA, numB;
};

// 加法类
class Add : public Operation {
public:
    Add(int a, int b) : Operation(a, b) {}

    double result() const override {
        return getNumA() + getNumB();
    }
};

// 减法类
class Sub : public Operation {
public:
    Sub(int a, int b) : Operation(a, b) {}

    double result() const override {
        return getNumA() - getNumB();
    }
};

// 乘法类
class Mul : public Operation {
public:
    Mul(int a, int b) : Operation(a, b) {}

    double result() const override {
        return getNumA() * getNumB();
    }
};

// 除法类
class Div : public Operation {
public:
    Div(int a, int b) : Operation(a, b) {}

    double result() const override {
        if (getNumB() == 0) {
            throw invalid_argument("division is 0");
        }
        return static_cast<double>(getNumA()) / getNumB();
    }
};

int main() {
    int a, b;
    cin >> a >> b;

    Add addOp(a, b);
    Sub subOp(a, b);
    Mul mulOp(a, b);
    Div divOp(a, b);

    try {
        cout << "Add result is " << addOp.result() << endl;
        cout << "Sub result is " << subOp.result() << endl;
        cout << "Mul result is " << mulOp.result() << endl;
        cout << "Div result is " << divOp.result() << endl;
    } catch (const exception& e) {
        cout << "" << e.what() << endl;
    }

    return 0;
}

C++课后习题及答案 一、 选择填空 1. 下列各种高级语言中,( )是面向对象的程序设计语言。 A.BASIC; B.PASCAL; C.C++ D.Ada 2. 下列各种高级语言中,( )是最早提出了对象的概念。 A.Algol 60; B.Simula 67; C.Smalltalk; D.C++ 3. 下述面向对象抽象的原理中,( )是不对的。 A. 数据抽象; B. 行为共享; C.进化; D. 兼容; 4. ( )不是面向对象系统所包含的要数。 A. 重载; B. 对象; C. 类; D. 继承; 5. 关于C++与C语言的关系的描述中,( )是错误的。 A. C语言C++的一个子集; B. C语言C++是兼容的; C. C++对C语言进行了一些改进; D. C++和C语言都是面向对象的; 6. 下面关于对象概念的描述中,( )是错误的。 A.对象就是C语言中的结构变量; B.对象代表着正在创建的系统中的一个实体; C. 对象是一个状态和操作(或方法)的封装体; D.对象之间的信息传递是通过消息进行的; 7. 下面关于类概念的描述中,( )是错误的。 A.类是抽象数据类型的实现; B.类是具有共同行为的若干对象的统一描述体; C.类是创建对象的样板; D.类就是C语言中的结构类型; 8. C++对C语言作了很多改进,下列描述中( )使得C语言发生了质变,即从面向过程变成为面向对象。 A.增加了一些新的运算符; B.允许函数重载,并允许设置缺省参数; C.规定函数说明必须用原型; D.引进了类和对象的概念; 9. 按照标识符的要求,( )符号不能组成标识符。 A.连接符; B. 下划线; C.大小写字母; D.数字字符; 10. 下列符号中,( )不可作为分隔符。 A.,; B.:;C.?; D.;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柒_02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值