燕山大学-面向对象程序设计实验-实验5 派生与继承:单重派生-实验报告

CSDN的各位友友们你们好,今天千泽为大家带来的是
燕山大学-面向对象程序设计实验-实验5 派生与继承:单重派生-实验报告,
接下来让我们一起进入c++的神奇小世界吧,相信看完你也能写出自己的 实验报告!
本系列文章收录在专栏 燕山大学面向对象设计报告中 ,您可以在专栏中找到其他章节
如果对您有帮助的话希望能够得到您的支持和关注,我会持续更新的!

实验五 派生与继承—单重派生

5.1 实验目的

1.理解继承的含义以及声明;

2.理解共有派生、私有派生和保护派生的含义以及使用;

3.理解单派生类中构造函数和析构函数的调用顺序。

5.2 实验内容

5.2.1程序阅读

1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include "iostream"

class CBase

{

public:

       CBase(int a)

              :a(a)

       {

       }

protected:

       void print()

       {

              cout<<"a="<<a<<endl;

       }

private:

       int a;

};

class CDerive : public CBase

{

public:

       void print()

       {

              CBase::print();

              cout<<"b="<<b<<endl;

       }

private:

       int b;

};

void main()

{

       CDerive d;

       d.print();

       CBase b;

       b.print();

}

问题一:以上程序有两大错误,试指出来,并改正之?

答:
(1)CBase成员函数print为protected,无法在主函数中直接访问。应该将print设为public。
(2)派生类CDerive无构造函数,无法进行初始化。修改后CDerive类代码如下:
class CDerive : public CBase{
 
    public:
 
        CDerive(int a):CBase(a){
 
        }
 
        void print(){
 
            CBase::print();
 
            cout<<"b="<<b<<endl;
 
        }
 
    private:
 
        int b;
 
};

2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include "iostream"

class CBase

{

public:

       CBase(int a)

              :a(a)

       {

              cout<<"base structure"<<endl;

       }

       ~CBase()

       {

              cout<<"base destructure"<<endl;

       }

       void print()

       {

              cout<<"a="<<a<<endl;

       }

protected:

       int a;

};

class CDerive : public CBase

{

public:

       CDerive(int a, int b,int c)

              :CBase(a),b(b),c(c)

       {

              cout<<"derive structure"<<endl;

       }

       ~CDerive()

       {

              cout<<"derive destructure"<<endl;

       }

       void print()

       {

              CBase::print();

              cout<<"b.a="<<b.a<<endl;

              cout<<"c="<<c<<endl;

       }

private:

       CBase b;

       int c;

};

void main()

{

       CDerive d(1,2,3); -----------------------------------------------------①

       d.print();

}

问题一:以上程序的输出结果是什么,说明为什么?

答:输出为
base structure
base structure
derive structure
a = 1
b,a = 2
c = 3
derive structure
base destructure
base destructure
说明在main中构造CDerive类时,传入的三个参数a,b,c,分别用于直接构造基类CBase,构造成员变量中的CBase类,给CDerive自己的成员变量赋值。因此在print前会有两个base structure和一个derive structure输出。析构时同理。

问题二:①处语句执行完后,d.b.a的值为多少?

答:①处语句执行完后,d.b.a的值为2。

5.2.2 程序设计

1.定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点:

a.CLine类含有计算直线长度和斜率的成员函数;

b.CCircle类含有计算圆面积的成员函数。

答:

#include<iostream>
 
#include<cmath>
 
using namespace std;
 
 
 
class CPoint{
 
    public:
 
        double x,y;
 
        CPoint(double x,double y):x(x),y(y){
 
        }
 
        CPoint():x(0),y(0){
 
        }
 
        void PrintPoint(){
 
            cout<<"点为("<<x<<","<<y<<")"<<endl;
 
        }
 
};
 
 
 
class CLine:public CPoint{
 
    private:
 
        CPoint p1,p2;
 
    public:
 
        CLine(double x1,double y1,double x2,double y2){
 
            p1.x=x1;
 
            p1.y=y1;
 
            p2.x=x2;
 
            p2.y=y2;
 
        }
 
        void PrintLength(){
 
            cout<<"直线长度:"<<sqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2))<<endl;
 
        }
 
        void PrintSlope(){
 
            cout<<"直线斜率:"<<(p2.y-p1.y)/(p2.x-p1.x)<<endl;
 
        }
 
        void PrintLine(){
 
            cout<<"直线端点为("<<p1.x<<","<<p1.y<<"),("<<p2.x<<","<<p2.y<<")"<<endl;
 
        }
 
};
 
 
 
class CCircle:public CPoint{
 
    private:
 
        double r;
 
    public:
 
        CCircle(double x,double y,double r):CPoint(x,y),r(r){
 
        }
 
        void PrintArea(){
 
            cout<<"圆面积:"<< 3.1415926*r*r<<endl;
 
        }
 
        void PrintCircle(){
 
            cout<<"圆心为("<<x<<","<<y<<"),半径为"<<r<<endl;
 
        }
 
};
 
 
 
int main(){
 
    CPoint a(2,3);
 
    a.PrintPoint();
 
    CLine b(0,0,5,5);
 
    b.PrintLine();
 
    b.PrintLength();
 
    b.PrintSlope();
 
    CCircle c(2,2,1);
 
    c.PrintCircle();
 
    c.PrintArea();
 
    return 0;
 
}

友友们多动手实践一下吧!

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千泽.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值