C++实验 多态

一、实验目的:

1.理解运算符重载的概念和实质,掌握运算符重载函数的定义方法,掌握运算符重载为类的成员函数和友元函数的方法。
2.掌握虚函数的定义方法及其在实现多态性中的应用,理解静态连编和动态链编的区别。

二、实验内容:

1.已知基类:
class Base{
public : virtual void I_am(){cout<<”Base”<<endl;}
};
要求:
(1)从Base类中派生出两个类,分别定义I_am()函数,实现输出自己类的名字。
(2)主函数中创建者3个类的对象来调用I_am()函数,再利用Base的指针数组通过循环语句来调用这3个对象的I_am()函数。

#include< iostream>
#include< string> 
using namespace std;
class base
{
public:
    base(){}
    virtual void i_am()
    {
        cout<<"I am base0"<<endl;
    }
};
class base1:public base
{
public:
    base1(){}
    void i_am()
    {
        cout<<"I am base1"<<endl;
    }
};
class base2:public base
{
public:
    base2(){}
    void i_am()
    {
        cout<<"I am base2"<<endl;
    }
};
int main()
{
    base x;
    base1 x1;
    base2 x2;
    base *a[3]={&x,&x1,&x2};
    for(int i=0;i<3;i++)
        a[i]->i_am();
    return 0;
}

运行测试:
在这里插入图片描述

3.编写程序,计算圆柱体,球体,正方体的表面积和体积。要求用抽象类实现。

#include <iostream>
using namespace std;
#define PI 3.14159
class Solid //定义抽象类
{
protected:
	double r;
	double s, v;
public:
	virtual double S() = 0;
	virtual double V() = 0;
	Solid(double a, double b, double c)
	{
		r = a;
		s = b;
		v = c;
	}
};

class Cube :public Solid
{
public:
	Cube(double a, double b, double c) : Solid(a, b, c)
	{
	}
	double S()
	{
		s = 6 * r * r;
		return s;
	}
	double V()
	{
		v = r * r * r;
		return v;
	}
};

class Sphere :public Solid
{
public:
	Sphere(double a, double b, double c) : Solid(a, b, c)
	{
	}
	double S()
	{
		s = 4 * PI * r * r;
		return s;
	}
	double V()
	{
		v = PI * r * r * r * 4 / 3;
		return v;
	}
};
class Cylinder :public Solid
{
protected:
	double high;
public:
	Cylinder(double h, double r, double a, double v) : Solid(r, a, v)
	{
		high = h;
	}
	double S()
	{
		s = 2 * PI * r * r + 2 * PI * r * high;
		return s;
	}
	double V()
	{
		v = PI * r * r * high;
		return v;
	}
};
double source_area(Solid* p)
{
	return p->S();
}
double volume(Solid* p)
{
	return p->V();
}
int main()
{
	char a;
	double r0, h;
	cout << "请输入正方体的边长:" ;
	cin >> r0;
	Cube cube(r0, 0, 0);
	cout << "正方体的表面积为:" << source_area(&cube) << endl << "正方体的体积为:" << volume(&cube) << endl;
	cout << "请输入球体的半径:";
	cin >> r0;
	Sphere sphere(r0, 0, 0);
	cout << "球体的表面积为:" << source_area(&sphere) << endl << "球体的体积为:" << volume(&sphere) << endl;
	cout << "请输入圆柱体的的底面半径:" ;
	cin >> r0;
	cout << "请输入圆柱体的的高:";
	cin >> h;
	Cylinder cylinder(r0, h, 0, 0);
	cout << "球体的表面积为:" << source_area(&cylinder) << endl << "球体的体积为:" << volume(&cylinder) << endl;
	return 0;
}

在这里插入图片描述

  1. 设计字符串类String,完成以下功能:
    (1)使用+运算符实现两个字符串的连接功能。
    (2)使用=运算符实现字符串的复制功能。
    (3)使用 == 运算符判断两个字符串是否相等功能。
    (4)使用[ ]运算符,可通过对象名和[ ]访问字符。
    注意使用深复制方式。
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
class String
{
public:
    String(){}
    String operator+(const String &a);
    String &operator=(const String &a);
    int operator==(const String &a);
    int Length(const String &a);
    String(char x[])
    {
        s=new char[strlen(x)];
        strcpy(s,x);
    }
    String(const String &str)
    {
        s=new char[strlen(str.s)+1];
        strcpy(s,str.s);
    }
    char *Get_s()
    {
        return s;
    }
private:
    char *s;
};
String String::operator+(const String &a)
{
    char *p=new char[strlen(a.s)+strlen(this->s)+1];
    strcpy(p,this->s);
    strcat(p,a.s);
    return String (p);
}
String &String::operator=(const String &a)
{
    s=new char[strlen(a.s)+1];
    strcpy(s,a.s);
    return *this;
}
int String::Length(const String &a)
{
    return strlen(a.s);
}
int String::operator==(const String &a)
{
    if(strcmp(s,a.s)==0)
        return 0;
    else
        return 1;
}
int main()
{
    String s1="helloFJUT", s2="helloworld", s3;
    string s4="helloFJUT",s5="helloworld";
    cout<<"s1=helloFJUT"<<" s2=helloworld"<<endl;
    cout<<"s1的长度为:"<<s1.Length(s1)<<endl;
    cout<<"s2的长度为:"<<s2.Length(s2)<<endl;
    if((s1==s2)==0)
    {
        cout<<"s1,s2相等!"<<endl;
    }
    else
    {
        cout<<"s1,s2不相等!"<<endl;
        cout<<"s1="<<s4<<endl;
        cout<<"s2="<<s5<<endl;
    }
    return 0;
}

在这里插入图片描述

4.编写复数类Complxnum,将+,-,*,/运算符重载,实现对应功能。

#include<iostream>
using namespace std;
class Complexnum
{
public:
    Complexnum(){real=0;imag=0;}//构造函数初始化
    Complexnum(double r,double i){real=r;imag=i;}//带参数的构造函数
    friend Complexnum operator+(Complexnum &c1,Complexnum &c2);//声明重载运算符+的函数作为友元函数
    friend Complexnum operator-(Complexnum &c1,Complexnum &c2);
    friend Complexnum operator*(Complexnum &c1,Complexnum &c2);
    friend Complexnum operator/(Complexnum &c1,Complexnum &c2);
    void display();
    void get_value();
private:
    double real;
    double imag;
};
Complexnum operator+(Complexnum &c1,Complexnum &c2)
{
    return Complexnum(c1.real+c2.real,c1.imag+c2.imag);
}
Complexnum operator-(Complexnum &c1,Complexnum &c2)
{
    return Complexnum(c1.real-c2.real,c1.imag-c2.imag);
}
Complexnum operator*(Complexnum &c1,Complexnum &c2)
{
    return Complexnum(c1.real*c2.real,c1.imag*c2.imag);
}
Complexnum operator/(Complexnum &c1,Complexnum &c2)
{
    return Complexnum(c1.real/c2.real,c1.imag/c2.imag);
}
void Complexnum::get_value()
{
    cin>>real>>imag;
 }
void Complexnum::display()
{
    cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
int main()
{
    Complexnum c1,c2,c3;
    c1.get_value();
    c2.get_value();
    c3=c1+c2;
    cout<<"c1=";c1.display();
     cout<<"c2=";c2.display();
    cout<<"c1+c2=";c3.display();
    c3=c1-c2;
    cout<<"c1-c2=";c3.display();
    c3=c1*c2;
      cout<<"c1*c2=";c3.display();
    c3=c1/c2;
    cout<<"c1/c2=";c3.display();
    return 0;
}

在这里插入图片描述

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我可以为您介绍一下关于C++中多和虚函数的实验。 首先,多是指不同对象以不同的方式响应相同的消息的能力。在C++中,通过虚函数来实现多。虚函数是指在基类中被声明为虚函数的函数,在派生类中被重写后,在程序中使用基类指针或引用调用该函数时,会调用派生类中的函数。 下面是一个简单的多和虚函数的实验示例: ```c++ #include<iostream> using namespace std; class Shape { public: virtual void draw() { cout << "Drawing Shape" << endl; } }; class Circle: public Shape { public: void draw() { cout << "Drawing Circle" << endl; } }; class Square: public Shape { public: void draw() { cout << "Drawing Square" << endl; } }; int main() { Shape *s; Circle c; Square sq; s = &c; s->draw(); s = &sq; s->draw(); return 0; } ``` 运行结果为: ``` Drawing Circle Drawing Square ``` 在上述示例中,我们定义了一个基类Shape和两个派生类Circle和Square,分别重写了基类的虚函数draw()。在程序中,我们先定义了一个基类指针s,然后将其指向第一个派生类对象c,再调用s的虚函数draw(),此时会调用派生类Circle的draw()函数,因为指针实际上指向的是Circle类型的对象。接着,我们将指针s重新指向第二个派生类对象sq,再次调用s的虚函数draw(),此时会调用派生类Square的draw()函数。 通过这个实验,我们可以看到多和虚函数的特性,即通过基类指针或引用调用虚函数时,会根据实际对象的类型来调用相应的派生类函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值