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

简介: 返回:贺老师课程教学链接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 { cha

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


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


目录
相关文章
|
28天前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
114 0
|
1月前
|
安全 编译器 C++
【C++20概念】编译时多态性的力量
【C++20概念】编译时多态性的力量
46 0
|
23天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
|
1月前
|
存储 算法 编译器
【C++入门到精通】C++入门 —— 多态(抽象类和虚函数的魅力)
多态是面向对象编程中的一个重要概念,指的是同一个消息被不同类型的对象接收时产生不同的行为。通俗来说,**就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态**。
44 0
|
1月前
|
算法 编译器 程序员
【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
81 0
|
1月前
|
缓存 编译器 程序员
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
62 0
|
1月前
|
缓存 编译器 程序员
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
27 0
|
1月前
|
缓存 算法 编译器
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
39 0
|
1月前
|
自然语言处理 编译器 调度
深入gcc编译器:C/C++代码如何变为可执行程序
深入gcc编译器:C/C++代码如何变为可执行程序
77 0
|
3天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
19 0

热门文章

最新文章