且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《C++语言基础》程序阅读——多态性与抽象类

更新时间:2022-10-04 23:16:05

返回:贺老师课程教学链接


1、阅读下面的程序,并写出运行结果
(1)虚函数
#include<iostream>
using namespace std;
class A {
int a;
public:
   A():a(5){}
   virtual void print()const { cout<<a;}
};
class B: public A {
   char b;
public:
    B() { b='E'; }
    void print() const { cout<<b; }
};
void show(A &x) { x.print(); }
int main()
{
   A d1,*p;
   B d2;
   p=&d2;
   d1.print();
   d2.print();
   p->print();
   show(d1);
   show(d2);
   return 0;
}


(2)虚析构函数
#include <iostream>
using namespace std;
class BASE
{
private:
    char c;
public:
    BASE(char n):c(n) {}
    virtual ~BASE() { cout<<c; }
};
class DERIVED:public BASE
{
private:
    char c;
public:
    DERIVED(char n):BASE(n+1),c(n) {}
    ~DERIVED(){ cout<<c; }
};
int main(){
    DERIVED d('X');
    return 0;
}  


(3)纯虚函数
#include <iostream>
using namespace std;
class Base
{
public:
    virtual void Who() =0;
};
class FirstDerived:public Base
{
public:
    void Who() { cout<<"F"; }
};
class SecondDerived:public Base
{
public:
    void Who() { cout<<"S"; }
};
int main()
{
    FirstDerived first_obj;
    SecondDerived second_obj;
    Base &bref=first_obj;
    bref.Who();
    bref=second_obj;
    bref.Who();
    Base *bp;
    bp=&first_obj;
    bp->Who();
    bp=&second_obj;
    bp->Who();
    return 0;
}

2、阅读、修改和运行关于交通工具类的程序,回答问题,以理解相关技术方法
(1)请写出程序的执行结果,并在上机时对照理解
#include <iostream>
using namespace std;
class Vehicle  //交通工具
{
public:
    void run() const
    { cout << "run a vehicle. "<<endl;  }
};
class Car: public Vehicle  //汽车
{
public:
    void run() const
    { cout << "run a car. "<<endl; }
};
class Airplane: public Vehicle  //飞机
{
public:
    void run() const
    { cout << "run a airplane. "<<endl; }
};
int main()
{
    cout<<"(a) 直接用对象访问成员函数: "<<endl;
    Vehicle v;
    v.run();
    Car car;
    Airplane airplane;
    car.run();
    airplane.run();
    cout<<"(b)用指向基类的指针访问成员函数: "<<endl;
    Vehicle *vp;
    vp=&car;
    vp->run();
    vp=&airplane;
    vp->run();
    return 0;
}
请回答:当基类的指针指向派生类时,用指针调用同名成员函数,执行的是基类的成员函数,还是派生类的成员函数?为什么会这样?

(2)如果将Vehicle类的定义修改为虚函数,其余不变,请写出程序的执行结果
class Vehicle {
public: 
    virtual void run() const { cout << "run a vehicle. "<<endl; } //(2) run()为虚函数
};
请回答:当基类的指针指向派生类时,用指针调用同名虚成员函数,执行的是基类的成员函数,还是派生类的成员函数?为什么会这样?什么是多态性?请结合本例的运行结果说明。

(3)如果将Vehicle类的定义修改为纯虚函数,找出main()函数中将使编译出错的行删除(或改为注释),请写出程序的执行结果,并在上机时对照理解
class Vehicle{
public: 
    virtual void run() const = 0; //(3) run()为纯虚函数,const意指其为常成员函数,并非纯虚函数之必要
}; 
请回答:当基类同名成员函数定义为纯虚函数后,发生了什么现象?为什么会这样?

(4)提交博文,记录实验过程和结果,用自己的话回答上面提出的问题,概括你对虚函数、多态性和抽象类的理解。——不要忽视回答问题,写出来,你会更明白。