面向对象程序设计C++练习题(1)

把学校课程网站上的C++作业做了个总结,方便以后的复习。

1-1.教材习题4_13:定义Circle类并计算面积
【问题描述】
定义一个Circle类,有数据成员radius(半径),成员函数getArea()计算圆的面积。构造一个Circle的对象进行测试(注:圆周率取值3.14)。

【输入形式】
程序参考的输入(提示“Input Radius:”):
Input Radius:10

【输出形式】
程序参考的输出:
Area:314

【样例输入】
Input Radius:10
【样例输出】
Area:314

#include<iostream>
#define Pi 3.14
using namespace std;
class Circle {
public:
	float getArea();
private:
	double radius;

};

float Circle::getArea() {
	cout << "Input Radius:";
	cin >> radius;
	return Pi * radius * radius;
}

int main()
{
	Circle radius;
	float area = radius.getArea();
	cout << "Area:" << area << endl;

}

1-2.教材习题4_8:定义Dog类,包含age和weight信息
【问题描述】
定义一个Dog类,包含age,weight等属性,以及对这些属性操作的方法。实现并测试这个类。

【输入形式】
程序参考的输入(提示“Input Age and Weight:”):
Input Age and Weight:3 20

【输出形式】
程序参考的输出:
Dog Age:3 years
Dog Weight:20kg

#include<iostream>
#define Pi 3.14
using namespace std;
class Dog
{
public:
    void setdog();
    void showdog();
private:
    int age;
    int weight;
};

void Dog::setdog()
{
    cout << "Input Age and Weight:";
    cin >> age >> weight;
}

void Dog::showdog()
{
    cout<<"Dog Age:"<<age<<" years"<<endl;
    cout<<"Dog Weight:"<<weight<<"kg"<<endl;
}

int main()
{
    Dog mimi;
    mimi.setdog();
    mimi.showdog();
}

2-1.教材习题4_9:通过屏幕两点确定矩形类Rectangle
【问题描述】
设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,根据坐标能计算矩形的面积。

【输入形式】
程序参考的输入(提示“Input Point A:”输入左下角的坐标;提示“Input Point B:”输入左下角的坐标):
Input Point A:0 0
Input Point B:8.2 4.5

【输出形式】
程序参考的输出:
Rectangle Area:36.9

【样例输入】
Input Point A:0 0
Input Point B:8.2 4.5

【样例输出】
Rectangle Area:36.9

#include <iostream>

using namespace std;

class Rectangle {
public:
	void getPoint();
	float getArea();
private:
	double x1;
	double x2;
	double y1;
	double y2;
	double Area;
};

void Rectangle::getPoint() {
	cout << "Input Point A:";
	cin >> x1 >> y1;
	cout << "Input Point B:";
	cin >> x2 >> y2;
}

float Rectangle::getArea(){
    Area=(x1-x2)*(y1-y2);
    if(Area<0){
        Area=-Area;
    }
    return Area;
}
int main()
{
    Rectangle a;
    a.getPoint();
    float area = a.getArea();
    cout << "Rectangle Area:" << area << endl;
    return 0;
}

2-2.教材习题4_20:定义满足要求的复数类Complex类
【问题描述】
定义一个复数类Complex,使得下面的代码能够工作。(注:下列代码需放在主函数中。)
Complex c1(3,5);    //用复数3+5i初始化c1
Complex c2=4.5;     //用实数4.5初始化c2
c1.add(c2);   //将c1与c2相加,结果保存在c1中
c1.show(); //将c1输出(这时的结果应该是7.5+5i)

【输入形式】

【输出形式】
7.5+5i

#include <iostream>
using namespace std;
class Complex
{
private:
double real;
double imag;
public:
    Complex(){real=0;imag=0;}
    Complex(double r){real=r;imag=0;};
    Complex(double r,double i){real=r;imag=i;};
    void add(Complex c1){real += c1.real;imag += c1.imag;};
    void show();
};
void Complex::show()
{
    cout<<real;
    if(imag>0)cout<<"+"<<imag<<"i"<<endl;
    else if(imag<0)cout<<imag<<"i"<<endl;
}
int main()
{
    Complex c1(3,5);
    Complex c2=4.5;
    c1.add(c2);
    c1.show();
    return 0;
}

3-1.使用Visual C++ 6.0或CodeBlocks集成环境来编辑编译并运行程序
【问题描述】
使用Visual C++ 6.0或CodeBlocks集成环境来编辑、编译并运行程序:

【输入形式】

【输出形式】
constructor.
3,4
x+y=7
constructor.
30,40
x+y=70
destructor.
30,40
destructor.
3,4

#include <iostream>
using namespace std;
class TAdd
{
public:
 TAdd(int a,int b)
 {
    x=a;y=b;
    cout<<"constructor."<<endl;
    cout<<x<<","<<y<<endl;
 }
 ~TAdd()
 {
    cout<<"destructor."<<endl;
    cout<<x<<","<<y<<endl;
  }
  int add(){return x+y;}
private:
  int x,y;
};

int main()
{
   TAdd p1(3,4);
   cout<<"x+y="<<p1.add()<<endl;
   TAdd p2(30,40);
   cout<<"x+y="<<p2.add()<<endl;
   return 0;
}

3-2.完成函数实现日期类Date
【问题描述】
定义日期类Date。要求:
(1)可以设置日期;
(2)日期加一天操作;
(3)输出函数,输出格式为“XXXX-XX-XX”;
(4)编写主函数,定义对象,完成相应功能。

【输入形式】
程序的参考的输入(“Input Date:”为提示文字):
Input Date:2016 2 28

【输出形式】
程序的输出:
2016-2-28
2016-2-29

【样例输入】
Input Date:2016 2 28

【样例输出】
2016-2-28
2016-2-29

#include <iostream>
using namespace std;
class Date
{
public:
  Date()
  {
    cout<<"Input Date:";
    cin>>y>>m>>d;
  }
  int beLeapYear()
  {
    return ((y%4==0&&y%100!=0)||(y%400==0));
  }
  void addOneDay()
  {
      d++;
      		switch(m)
      		{
      			case 1:
      			case 3:
      			case 5:
      			case 7:
      			case 8:
      			case 10:
      			case 12:
      				{
      					if(d > 31)
      					{
      						d -= 31;
      						m=1;
      						y++;
      					}
      					break;
      				}
      			case 4:
      			case 6:
      			case 9:
      			case 11:
      				{
      					if(d > 30)
      					{
      						d-= 30;
      						m++;
      					}
      					break;
      				}
      			case 2:
      				{
      					if(beLeapYear())
      					{
      						if(d > 29)
      						{
      							d -= 29;
      							m++;
      						}
      					}
      					else
      					{
      						if(d > 28)
      						{
      							d -= 28;
      							m++;
      						}
      					}
      					break;
      				}
      			default:
      				{
      					break;
      				}
      		    
      		} 

  }
  void showDate()
  {
    cout<<y<<"-"<<m<<"-"<<d<<endl;
   }
private:
  int y,m,d;
  };
int main()
{
   Date d;
   d.showDate();
   d.addOneDay();
   d.showDate();
}

4-1.教材习题5_3:全局变量与局部变量
【问题描述】
下面程序的运行结果是什么?实际运行一下,看看与你的设想有何不同。
注:只需调试一下代码即可,原样输入。

#include <iostream>

using namespace std;
int x=5,y=7;
void myFunction(){
    int y=10;
    cout<<"x from myFunction:"<<x<<endl;
    cout<<"y from myFunction:"<<y<<endl;
}

int main()
{
    cout<<"x from main:"<<x<<endl;
    cout<<"y from main:"<<y<<endl;
    myFunction();
    cout<<"Back from myFunction!"<<endl;
    cout<<"x from main:"<<x<<endl;
    cout<<"y from main:"<<y<<endl;
    return 0;
}

4-2.教材习题5_7:利用静态变量统计小猫Cat的数量
【问题描述】
定义一个Cat类,拥有静态数据成员numOfCats,记录Cat的个体数目;静态成员函数getNumOfCats(),读取numOfCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。

主函数如下:

int main()
{
    Cat c;
    cout<<"Num:"<<Cat::getNumOfCats()<<endl;
    Cat carr[4];
    cout<<"Num:"<<Cat::getNumOfCats()<<endl;
    return 0;
}

参考的输出结果为:
Num:1
Num:5

【输入形式】

【输出形式】
Num:1
Num:5

#include <iostream>
using namespace std;
class Cat
{
public:
    Cat()
    {
        numOfCats++;
    }
    ~Cat()
    {
        numOfCats--;
    }
    static int getNumOfCats()
    {
        return numOfCats;
    }
private:
    static int numOfCats;
};

int Cat::numOfCats = 0;
int main()
{
    Cat c;
    cout<<"Num:"<<Cat::getNumOfCats()<<endl;
    Cat carr[4];
    cout<<"Num:"<<Cat::getNumOfCats()<<endl;
    return 0;
}

5-1.教材习题5_14:定义Boat与Car两个类,友元计算总重量
【问题描述】
定义Boat与Car两个类,二者都有weight属性,定义二者的一个友元函数getTotalWeight(),计算二者的重量和。

【输入形式】
参考的输入(数字前为提示文字):
Input boat weight:3
Input car weight:5

【输出形式】
参考的输出:
Total weight:8

【样例输入】
Input boat weight:3
Input car weight:5

【样例输出】
Total weight:8

#include <iostream>
using namespace std;
class car;
class boat{
private:
	int weight;
public:
	boat();
	friend int gettotalweight(boat &b,car &c);
};
boat::boat(){
    cout <<"Input boat weight:";
    cin>>weight;
}
class car{
private:
	int weight;
public:
	car();
	friend int gettotalweight(boat &b,car &c);
};
car::car(){
    cout <<"Input car weight:";
    cin>>weight;
}
int gettotalweight(boat &b,car &c){
	return b.weight+c.weight;
}
int main(){
	boat b;
	car c;
	cout<<"Total weight:"<<gettotalweight(b,c)<<endl;
	return 0;
}

5-2.教材习题5_13:定义类X,Y,Z,按要求实现友元
【问题描述】
定义类X,Y,Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的成员i加1;类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5;函数h(X*)是X的友元函数,实现对X的成员i加10。主函数实现测试。主函数需要定义如下:

int main()
{
    int a;
    cin>>a;
    X x(a);
    Y y;
    Z z;
    y.g(x);
    z.f(x);
    h(x);
    x.print();
}

【输入形式】
参考的输入:
3

【输出形式】
参考的输出:
19

【样例输入】
3
【样例输出】
19

#include <iostream>
using namespace std;
class X;

class Y
{
public:
    void g(X &x);
};

class Z
{
public:
    void f(X &x);
};

class X
{
public:
    X(int i):i(i) {}
    friend void Y::g(X &x);
    friend class Z;
    friend void h(X &x);
    void print()
    {
        cout<<i;
    }
private:
    int i;
};

void Y::g(X  &x)
{
    x.i++;
}
void Z::f(X  &x)
{
    x.i+=5;
}
void h(X  &x)
{
    x.i+=10;
}

int main()
{
    int a;
    cin>>a;
    X x(a);
    Y y;
    Z z;
    y.g(x);
    z.f(x);
    h(x);
    x.print();
}

6-1.利用对象数组,计算10个顶点组成折线的长度
【问题描述】
假设有一个点类point,具有两个实数坐标。希望主程序使用这个类完成下述功能:
(l)主程序为类point定义10个点的对象数组(也可以动态申请空间)。
(2)要求调用一个函数Set()从键盘输入10个对象的属性。
(3)要求调用一个函数Display()显示10个对象的值。
(4)要求调用一个函数Lenth(),计算将这些点连成一条折线时,这条折线的长度。

【输入形式】
参考的输入(每个点要求提示“Input x,y:”):
Input x,y:0 0
Input x,y:3 5
Input x,y:2 4
Input x,y:9 8
Input x,y:2 3
Input x,y:8 9
Input x,y:7 6
Input x,y:2 9
Input x,y:5 8
Input x,y:6 6

【输出形式】
参考的输出:
(0,0)
(3,5)
(2,4)
(9,8)
(2,3)
(8,9)
(7,6)
(2,9)
(5,8)
(6,6)
Length:46.7866

#include <iostream>
#include <math.h>
using namespace std;
#define MAX 10
#define col 0
class CPoint
{
private:
    int array[MAX][2];
    float DisAB;
    float sum;
public:
    void CSetPoint();
    void Display();
    void Lenth();
    float PowerX_X(int i);
    float PowerY_Y(int i);
    float Twodist();
};
void CPoint::CSetPoint()
{
    //cause this is a point,so the col is 2,and i made the default value is 0
    for(int i=0; i<MAX;i++)
    {
        cout<<"Input x,y:";
        cin >> array[i][col]
            >>array[i][col+1];  //Store the two values of input
    }
}
void CPoint::Display()  //display the point that your input
{
    for(int i=0; i<MAX;i++)
    {
        cout <<"("
             << array[i][col] <<","
             << array[i][col+1] <<")"
             <<endl;
    }
}
float CPoint::PowerX_X(int i) //compute (X1-X2)*(X1-X2)
{
   return (array[i][col] - array[i+1][col]) * (array[i][col] - array[i+1][col]);
}
float CPoint::PowerY_Y(int i)     //compute (Y1-Y2)*(Y1-Y2)
{
   return (array[i][col+1] - array[i+1][col+1]) * (array[i][col+1] - array[i+1][col+1]);
}
float CPoint::Twodist()   //compute the distance of two point
{
    sum=0;
    for(int point = 0; point < MAX-1; point++) //must be carful.ten point ,just compute nine times
    {
        int XX=PowerX_X(point);
        int YY=PowerY_Y(point);
        sum += fabs ( DisAB = sqrt ( XX + YY ) );   //compute sum of each point
    }
    return sum;
}
void CPoint::Lenth()    //obtain the return value and display
{
    float lenth ;
    lenth = Twodist();
    cout << "Length:"<< lenth <<endl;
}
int main()
{
    CPoint point;
    point.CSetPoint();
    point.Display();
    point.Lenth();
    return 0;
}

6-2.定义Employee类,输出编号和姓名
【问题描述】
定义一个Employee类,在Employee类中增加一个数据(静态数据成员)来设置本公司员工编号基数,新增加的员工编号将在创建对象的同时自动在基数上增加(程序输入2个人员)。

【输入形式】
参考的输入如下(提示“Input name:”):
Input name:zhangsan
Input name:lisi

【输出形式】
参考的输出如下:
ID:1001 Name:zhangsan
ID:1002 Name:lisi

#include <iostream>
#include <string>
using namespace std;
class Employee
{
public:
    Employee();
    void display();
private:
    static int base_id;
    int id;
    string name;
};
int  Employee::base_id=0;
Employee::Employee(){
    base_id++;
    id=1000+base_id;
    cout<<"Input name:";
    cin>>name;

}
void  Employee::display(){
    cout<<"ID:"<<id<<" Name:"<<name<<endl;
}

int main()
{
    Employee e1;
    Employee e2;
    e1.display();
    e2.display();
    return 0;
}

7-1.教材习题7_5:Shape类派生Rectangle和Circle类
【问题描述】
定义一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有getArea()函数计算对象面积。使用Rectangle类创建一个派生类Square。
注:圆周率取3.14

【输入形式】
参考的输入(数字前面的文字为提示):
Input a,b:5 10
Input r:10

【输出形式】
参考的输出:
Rectangle Area:50,Circle Area:314

#include<iostream>
#include<string>
#define PAI 3.14
using namespace std;
class Shape{
public:
    int getarea();
};

class Rectangle:public Shape{
public:
    void setab();
    void getab(){
        cout<<"Input a,b:";
        cin>>a>>b;
    }
    int getarea(){
        return a*b;
    }
private:
    int a;
    int b;
};

class Circle:public Shape{
public:
    void setr();
    void getr(){
        cout<<"Input r:";
        cin>>r;
    }
    float getarea(){
        return r*r*PAI;
    }
private:
    int r;
};

class Square:public Rectangle{
public:
    void setside();
    void getside();
    int getarea();
private:
    int side;
};

int main(){
    Rectangle a;
    Circle b;
    a.getab();
    b.getr();
    cout<<"Rectangle Area:"<<a.getarea();
    cout<<",Circle Area:"<<b.getarea();
    return 0;
}

7-2.教材习题7_6:哺乳动物类Mammal派生出狗类Dog
【问题描述】
定义一个哺乳动物类Mammal,再由此派生出狗类Dog,定义一个Dog类的对象,观察基类与派生类的构造函数和析构函数的调用顺序。

【输入形式】
参考的输入为("Input Dog Name:"为提示文字):
Input Dog Name:wangcai

【输出形式】
参考的输出为:
Con.Mammal
Con.Dog:wangcai
Des.Dog:wangcai
Des.Mammal

#include <iostream>
#include <string>
using namespace std;
class Mammal
{
public:
    Mammal(string name):name(name)
    {
        cout<<"Con.Mammal"<<endl;
    }
    ~Mammal()
    {
        cout<<"Des.Mammal"<<endl;
    }
protected:
    string name;
};
class Dog:public Mammal{
public:
    Dog(string name):Mammal(name),n(name)
    {
        cout<<"Con.Dog:"<<n<<endl;
    }
    ~Dog()
    {
        cout<<"Des.Dog:"<<n<<endl;
    }
private:
    string n;
};

int main()
{
    string name;
    cout<<"Input Dog Name:";
    cin>>name;
    Dog d(name);
    return 0;
}

7-3.教材习题6_20:实现一个简单圆类
【问题描述】
实现一个名为SimpleCircle的简单圆类。其数据成员int *itsRadius为一个指向其半径值的指针,存放其半径值。设计对数据成员的各种操作并计算面积,给出这个类的完整实现并测试这个类。
注:简单计算半径为10的圆面积,不需要输入,圆周率取3.14。

【输入形式】

【输出形式】
Area:314

#include <iostream>
using namespace std;
const float pi=3.14;
class SimpleCircle
{
public:
SimpleCircle(float Radius = 0)
    {
        itsRadius = new float(Radius);
 
    }

    void setRadius(float r)
    {
        *itsRadius=r;
    }
    float getRadius()
    {
        return *itsRadius;
    }
    float getArea()
    {
        return (*itsRadius)*(*itsRadius)*pi;
    }
private:
    float *itsRadius;
};
int main()
{
    SimpleCircle c;
    c.setRadius(10);
    cout<<"Area:"<<c.getArea()<<endl;
}

8-1.教材习题7_8:定义一个Document类和Book类
【问题描述】
定义一个Document类,有数据成员name,从Document派生出Book类,增加数据成员pageCount。

【输入形式】
程序参考的输入(数据前面文字为提示):
Input Name and Page:Math 280

【输出形式】
程序参考的输出:
Name:Math
Page:280

#include <iostream>
#include <string.h>
using namespace std;
class Document{
public:
    Document(){};
    Document(const char *name);
    char *Name;
    void PrintNameOf();
};

Document::Document(const char *name){
    Name=new char[strlen(name)+1];
    strcpy(Name,name);
};

void Document::PrintNameOf(){
    cout<<Name<<endl;
}

class Book:public Document{
public:
    Book(const char *name,long pagecount);
    void getnamepage();
    void PrintNameOf();
    void PrintPage();
private:
    long PageCount;
};

Book::Book(const char *name,long pagecount):Document(name){
    PageCount=pagecount;
}

void Book::getnamepage(){
    cout<<"Input Name and Page:";
    cin>>Name>>PageCount;
}

void Book::PrintNameOf(){
    cout<<"Name:";
    Document::PrintNameOf();
}

void Book::PrintPage(){
    cout<<"Page:"<<PageCount<<endl;
}

int main()
{
    Document a("0");
    Book b("0",0);
    b.getnamepage();
    b.PrintNameOf();
    b.PrintPage();
    return 0;
}

8-2.教材习题7_10:定义一个Object类和Box类
【问题描述】
定义一个Object类,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员height和width及相应的操作函数,声明一个Box对象,观察构造函数和析构函数的调用顺序。
【输入输出形式】
参考的输入及输出(其中Input开头的两段文字为输入提示和输入数据,其他均为输出):
Constructing Object!
Constructing Box!
Input weight:50
Input height and width:20 30
Weight:50
Height and width:20,30
Destructing Box!
Destructing Object!

#include <iostream>
#include <string>
using namespace std;
class Object
{
public:
    Object()
    {
        cout<<"Constructing Object!"<<endl;
    }
    ~Object()
    {
        cout<<"Destructing Object!"<<endl;
    }
    void getInfo()
    {
        cout<<"Input weight:";
        cin>>weight;
    }
    void showInfo()
    {
        cout<<"Weight:"<<weight<<endl;
    }
private:
    int weight;
};
class Box:public Object
{
public:
    Box()
    {
        cout<<"Constructing Box!"<<endl;
    }
    ~Box()
    {
        cout<<"Destructing Box!"<<endl;
    }
    void  getInfo()
    {
        Object::getInfo();
        cout<<"Input height and width:";
        cin>>height>>width;
    }
    void  showInfo()
    {
        Object::showInfo();
        cout<<"Height and width:"<<height<<","<<width<<endl;
    }
private:
    int height;
    int width;
};

int main()
{
    Box box;
    box.getInfo();
    box.showInfo();
    return 0;
}

9-1.教材习题7_13:编写程序输出各个类各自的地址
【问题描述】
思考例7-6和例7-8中Derived类的各个数据成员在Derived对象中存放的位置,编写程序输出它们各自的地址来验证自己的判断。
录入下面的代码,自行分析输出结果。

//7_8.cpp

#include <iostream>

using namespace std;

class Base0 {    //定义基类Base0
public:
    int var0;
    void fun0() { cout << "Member of Base0" << endl; }
};

class Base1: virtual public Base0 {    //定义派生类Base1
public:    //新增外部接口
    int var1;
};

class Base2: virtual public Base0 {    //定义派生类Base2
public:    //新增外部接口
    int var2;
};

class Derived: public Base1, public Base2 {    //定义派生类Derived
public:    //新增外部接口
    int var;
    void fun() { cout << "Member of Derived" << endl; }
};

int main() {    //程序主函数
    Derived d;    //定义Derived类对象d
    d.var0 = 2;    //直接访问虚基类的数据成员
    d.fun0();    //直接访问虚基类的函数成员
    if(&d.Base1::var0==&d.Base2::var0)
        cout<<"true"<<endl;
    else
        cout<<"false"<<endl;
    return 0;
}

9-2.教材习题7_15:下面的程序能得到预期的结果吗?
【问题描述】
下面的程序能得到预期的结果吗?如何避免类似问题的发生?
请修改程序,使它得到我们想要的结果。即希望两个输出的值相同。
提示:struct在C++中也可以用来定义类,它与class的不同在于struct定义的类成员的默认访问权限是public。

#include <iostream>
using namespace std;
struct Base1 {int x;};
struct Base2 {float y;};
struct Derived : Base1,Base2{};
int main()
{
    Derived *pd=new Derived;
    pd->x=1;pd->y=2.0f;
    void *pv = pd;
    Base2 *pb=static_cast<Base2*>(pv);
    cout<<pd->y<<" "<<pb->y<<endl;
    delete pd;
    return 0;
}

【输入形式】

【输出形式】
2 2

#include <iostream>
using namespace std;
struct Base1 {int x;};
struct Base2 {float y;}
struct Derived : Base1,Base2{};
int main()
{
    Derived *pd=new Derived;
    pd->x=1;pd->y=2.0f;
    Derived *pv = pd;
    Base2 *pb=static_cast<Base2*>(pv);
    cout<<pd->y<<" "<<pb->y<<endl;
    delete pd;
    return 0;
}

9-3.教材习题7_11:基类BaseClass派生出类DerivedClass
【问题描述】
定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2()。在主函数中声明一个DerivedClass的对象,分别用DerivedClass的对象以及BaseClass和DerivedClass的指针来调用fn1(),fn2(),观察运行结果。

主函数如下:
int main()
{
    DerivedClass dc;
    BaseClass *pb = &dc;
    DerivedClass *pd = &dc;
    dc.fn1();
    dc.fn2();
    pb->fn1();
    pb->fn2();
    pd->fn1();
    pd->fn2();
}


【输入形式】

【输出形式】
程序的输出结果为:
DerivedClass:fn1()
DerivedClass:fn2()
BaseClass:fn1()
BaseClass:fn2()
DerivedClass:fn1()
DerivedClass:fn2()

#include <iostream>
using namespace std;
class BaseClass{
public:
void fn1(){
cout<<"BaseClass:fn1()"<<endl;
}
void fn2(){
cout<<"BaseClass:fn2()"<<endl;
}
};
class DerivedClass:public BaseClass{
public:
void fn1(){
cout<<"DerivedClass:fn1()"<<endl;
}
void fn2(){
cout<<"DerivedClass:fn2()"<<endl;
}
};

int main()
{
    DerivedClass dc;
    BaseClass *pb = &dc;
    DerivedClass *pd = &dc;
    dc.fn1();
    dc.fn2();
    pb->fn1();
    pb->fn2();
    pd->fn1();
    pd->fn2();
}

10-1.录入程序分析结果
【问题描述】
输入以下程序,分析运行结果

#include <iostream>
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<<b1<<endl; }
    void print() { cout<<b1<<endl; }
private:
    int b1;
};

class B2
{
public:
    B2(int i)
    {
        b2 = i;
        cout<<"Constructing B2."<<b2<<endl; }
    void print() { cout<<b2<<endl;}
private:
    int b2;
};

class B3
{
public:
    B3(int i)
    {
        b3 = i;
        cout<<"Constructing B3."<<b3<<endl; }
    int getb3() { return b3; }
private:
    int b3;
};

class A : public B2, public B1
{
public:
    A(int i, int j, int k, int l):B1(i), B2(j), bb(k)
    {
        a = l;
        cout<<"Constructing A."<<a<<endl; }
    void print()
    {
        B1::print();
        B2::print();
        cout<<a<<endl;}
private:
    int a;
    B3 bb;
};

int main()
{
    A aa(1, 2, 3, 4);
    aa.print();
    return 0;
}

【输入形式】

【输出形式】
Constructing B2.2
Constructing B1.1
Constructing B3.3
Constructing A.4
1
2
4

10-2.修改下面的4个类,添加析构函数
【问题描述】
修改下面的4个类,添加析构函数,在析构函数中输出各私有数据成员的值。并分析结果。
修改后程序的输出结果为:
Constructing B2.2
Constructing B1.1
Constructing B3.3
Constructing A.4
1
2
4
Destructing A.4
Destructing B3.3
Destructing B1.1
Destructing B2.2


待修改的程序源代码如下:

#include <iostream>
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<<b1<<endl; }
    void print() { cout<<b1<<endl; }
private:
    int b1;
};

class B2
{
public:
    B2(int i)
    {
        b2 = i;
        cout<<"Constructing B2."<<b2<<endl; }
    void print() { cout<<b2<<endl;}
private:
    int b2;
};

class B3
{
public:
    B3(int i)
    {
        b3 = i;
        cout<<"Constructing B3."<<b3<<endl; }
    int getb3() { return b3; }
private:
    int b3;
};

class A : public B2, public B1
{
public:
    A(int i, int j, int k, int l):B1(i), B2(j), bb(k)
    {
        a = l;
        cout<<"Constructing A."<<a<<endl; }
    void print()
    {
        B1::print();
        B2::print();
        cout<<a<<endl;}
private:
    int a;
    B3 bb;
};

int main()
{
    A aa(1, 2, 3, 4);
    aa.print();
    return 0;
}
#include <iostream>
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<<b1<<endl;
    }
    void print()
    {
        cout<<b1<<endl;
    }
    ~B1()
    {
        cout<<"Destructing B1."<<b1<<endl;
    }
private:
    int b1;
};

class B2
{
public:
    B2(int i)
    {
        b2 = i;
        cout<<"Constructing B2."<<b2<<endl;
    }
    void print()
    {
        cout<<b2<<endl;
    }
    ~B2()
    {
        cout<<"Destructing B2."<<b2<<endl;
    }
private:
    int b2;
};


class B3
{
public:
    B3(int i)
    {
        b3 = i;
        cout<<"Constructing B3."<<b3<<endl;
    }
    int getb3()
    {
        return b3;
    }
    ~B3()
    {
        cout<<"Destructing B3."<<b3<<endl;
    }
private:
    int b3;
};

class A : public B2, public B1
{
public:
    A(int i, int j, int k, int l):B1(i), B2(j), bb(k)
    {
        a = l;
        cout<<"Constructing A."<<a<<endl;
    }
    void print()
    {
        B1::print();
        B2::print();
        cout<<a<<endl;
    }
    ~A()
    {
        cout<<"Destructing A."<<a<<endl;
    }
private:
    int a;
    B3 bb;
};

int main()
{
    A aa(1, 2, 3, 4);
    aa.print();
    return 0;
}

10-3.定义一个员工类、经理类、销售员类和销售经理类
【问题描述】
定义一个员工类Employee,有数据成员姓名,编号。定义一个销售员继承自员工类Sales,工资为销售额的提成10%,定义一个经理类Manager,固定工资8000,定义一个销售经理类,继承自销售员类和经理类,工资为固定工资5000加销售额的提成5%。每个类均有display()函数输出信息,编写主函数测试。主函数中定义一个销售经理对象,销售额为100000,输出信息。

【输入形式】
程序参考的输入(第一行为提示文字):
Input id name and sale:
M001 zhangsan 100000

【输出形式】
程序参考的输出结果如下:
ID:M001
Name:zhangsan
Salary:10000

#include <iostream>
using namespace std;
class Employee
{
public:
    Employee(string id,string name):id(id),name(name)
    {}
    void display()
    {
        cout<<"ID:"<<id<<endl;
        cout<<"Name:"<<name<<endl;
    }
protected:
    string id,name;
};

class SalesManager
{
public:
    SalesManager(string  id,string  name,float sale):id(id),name(name),sale(sale)
    {}
    void display()
    {
        cout<<"ID:"<<id<<endl;
        cout<<"Name:"<<name<<endl;
        salary=5000+sale/20;
        cout<<"Salary:"<<salary<<endl;
    }
private:
    string  id,name;
    float sale,salary;
};

int main()
{
    string id,name;
    float sale;
    cout<<"Input id name and sale:"<<endl;
    cin>>id>>name>>sale;
    if(sale<0)
    {
        cout<<"Input Error!"<<endl;
        return 0;
    }
    SalesManager sm(id,name,sale);
    sm.display();
    return 0;
}

文章标签:

原文连接:https://blog.csdn.net/m0_53022214/article/details/118999009

相关推荐

领域驱动设计:事件溯源架构简介

Figma自编教程第三篇(也是做产品实习生的第三天)

Flutter 绘制探索 | 箭头端点的设计

为什么设计的软件不好用?那是因为不熟悉软件开发模型!一文熟悉软件开发模型

Netty 案例之 IM 方案设计

【设计模式】责任链模式(Chain of Responsibility Pattern)

VGA设计(原理说明。Verilog代码实现,仿真结果)

提升UI产品体验的14个细节!你都知道吗?

【毕业设计】深度学习 opencv python 实现中国交通标志识别

TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2

还记得当年的超级玛丽么?来吧,动手设计一款小霸王游戏机

Figma自编教程第二篇(也是做产品实习生的第二天)

【毕业设计】python+大数据构建疫情可视化分析系统

Go的错误处理设计

Figma自编教程第一篇(也是做产品实习生的第一天)

【设计模式】模板模式,学会它咱也写出优雅健壮的代码!

从全局角度,如何设计一个秒杀系统?

【分享】从Mybatis源码中,学习到的10种设计模式

【干货】MySQL底层架构设计,你了解多少?

【C++】从设计原理来看string类