第六章 继承性:派生类

本文探讨了C++中继承的四种访问方式(公有、保护、私有和受保护继承)及其对垂直和水平访问的影响。通过实例演示了类的私有成员访问权限、派生类对基类成员的可见性,以及在公有派生中的赋值和初始化操作。同时提供了创建派生类和计算几何形状面积的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断题

(部分)
2.在protected保护继承中,对于垂直访问等同于公有继承,对于水平访问等同于私有继承。(T)

选择题

1.一个类的私有成员(B)

A.只能被该类的成员函数访问
B.只能被该类的成员函数和友元函数访问
C.只能被该类的成员函数、友元函数和派生类访问
D.以上答案都不对

3.在公有继承的情况下,在派生类中能够访问的基类成员包括(D)

A.公有成员
B.保护成员
C.公有成员、保护成员和私有成员
D.公有成员和保护成员

6.假设在公有派生情况下,以下说法不正确的是(C)

A.可以将基类对象复制给派生类对象
B.可以将派生类对象的地址复制给基类指针
C.可以将派生类对象赋值给基类的引用
// 初始化
D.可以将派生类对象赋值给基类对象


在共有继承时:
1.可以用派生类对象给基类对象赋值。
2.可以用派生类的对象初始化基类对象的引用。
3.可以用派生类对象的地址给基类对象的指针赋值。
// 相当于B.“可以将派生类对象的地址赋值给基类指针”

3.以下关于C++语言中继承的叙述中,错误的是( )。(D)
//****
A.继承是父类和子类之间共享数据和方法的机制
B.继承定义了一种类与类之间的关系
C.继承关系中的子类将拥有父类的全部属性和方法
D.继承仅仅允许单继承,即不允许一个子类有多个父类

4.下列关于类的继承描述中,( )是正确的。(D)

A.派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数。
B.派生类也是基类,所以它们是等价的。
C.派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员。
D.一个基类可以有多个派生类,一个派生类可以有多个基类。

函数题

1.求平面几何形状的面积(圆形和矩形)C++
下列shape类是一个表示形状的基类,该类有一个计算形状面积的方法area( )。请以形状类"Shape"为基类派生出圆形类"Circle"和矩形类"Rectangle",要求保持求面积的接口不变。从键盘输入圆形的半径和矩形的长和宽,在主函数中创建一个圆形类"Circle"的对象和一个矩形类"Rectangle"的对象,计算并输出这个圆形和矩形的面积。圆周率PI=3.14

class shape{
public:
double area( ){ }
};
圆形类名:Circle 注意:圆周率PI=3.14
矩形类名:Rectangle

裁判测试程序样例:

#include <iostream>
using namespace std;
class Shape{
public:
    double area ( ){ return -1; }
};
//你提交的代码将嵌入到这里。 

int main()
{
    double r,h,w;
    cin>>r>>h>>w;
    Circle c(r); Rectangle rect(h,w);

    cout<<"The area of the Circle is "<<c.area( )<<endl;
    cout<<"The area of the Rectangle is "<<rect.area( )<<endl;

    return 0;
}

输入样例:

8.8
16.8  9.8

输出样例:

The area of the Circle is 243.162
The area of the Rectangle is 164.64
//没有用到继承,与输出样例相同

class Circle
{
private:
	double r;
public:
	Circle(double r1){r = r1;}
	double area(){return 3.14*r*r;}
};

class Rectangle
{
private:
	double h,w;
public:
	Rectangle(double h1,double w1){h=h1;w=w1;}
	double area(){return h*w;}
};

2.写出派生类构造方法
裁判测试程序样例中展示的是一段定义基类People、派生类Student以及测试两个类的相关C++代码,其中缺失了部分代码,请补充完整,以保证测试程序正常运行。

函数接口定义:
提示:
观察类的定义和main方法中的测试代码,补全缺失的代码。

裁判测试程序样例:
注意:真正的测试程序中使用的数据可能与样例测试程序中不同,但仅按照样例中的格式调用相关函数。

#include <iostream>
using namespace std;
class People{
private:
    string id;
    string name;
public:
    People(string id, string name){
        this->id = id;
        this->name = name;
    }
    string getId(){
        return this->id;
    }
    string getName(){
        return name;
    }
};
class Student : public People{
private:
    string sid;
    int score;
public:
    Student(string id, string name, string sid, int score)

        /** 你提交的代码将被嵌在这里(替换此行) **/

    }
    friend ostream& operator <<(ostream &o, Student &s);
};
ostream& operator <<(ostream &o, Student &s){
    o << "(Name:" << s.getName() << "; id:"
      << s.getId() << "; sid:" << s.sid
      << "; score:" << s.score << ")";
    return o;
}
int main(){
    Student zs("370202X", "Zhang San", "1052102", 96);
    cout << zs  << endl;
    return 0;
}

输入样例:

(无)

输出样例:

(Name:Zhang San; id:370202X; sid:1052102; score:96)
// 这个不是我自己写的
: People(id,name){
        this->sid = sid;
        this->score = score;
}
    string getsid() {
        return this->sid;
    }
    int getscore() {
        return this->score;
 

3.计算圆柱体的表面积(函数名隐藏)
Cylinder类是Circle类的派生类,在下面的程序中计算并输出了圆柱体的表面积。请阅读理解下面的程序。将下面的Cylinder类补充完整后提交。

Cylinder类的定义:

class Cylinder :public Circle{
         double height;             
public:
......
};

你提交的Cylinder类的定义将嵌入到下面的程序中:

#include <iostream>
using namespace std;
const double PI=3.1415926;
class Circle{
protected:
   double radius;
public: 
   Circle(double r){
      radius=r;
   }
   double getArea(){
      return PI*radius*radius;
   }
};
// 你提交的代码将嵌入在这里

int main() 
{
   double r,h;
   cin>>r>>h;
   Cylinder Cy1(r,h) ;
   cout<<Cy1.getArea()<<endl;
   return 0;
}

输入样例:

3.5 4.2

输出样例:

106.369
class Cylinder :public Circle{
         double height;             
public:
	Cylinder(double r,double h):Circle(r)
	{
		this->height = h;
	}

	double getArea()
	{
		return Circle::getArea()*2+2*radius*height;  
 
	}

};

编程题

1.学生CPP成绩计算
给出下面的人员基类框架:

class Person {
protected:
string name;
int age;
public:
Person();
Person (string p_name, int p_age);
void display () {cout<<name<<“:”<<age<<endl;}
};
建立一个派生类student,增加以下成员数据:

int ID;//学号
float cpp_score;//cpp上机成绩
float cpp_count;//cpp上机考勤
float cpp_grade;//cpp总评成绩
     //总评成绩计算规则:cpp_grade = cpp_score * 0.9 + cpp_count * 2;

增加以下成员函数:
student类的无参构造函数
student类的参数化构造函数//注意cpp_grade为上机成绩和考勤的计算结果
void print()//输出当前student的信息
//其中cpp_grade输出保留一位小数
//输出格式为ID name cpp_grade

生成上述类并编写主函数,根据输入的学生基本信息,建立一个学生对象,计算其cpp总评成绩,并输出其学号、姓名、总评成绩。

输入格式: 测试输入包含若干测试用例,每个测试用例占一行(学生姓名 学号 年龄 cpp成绩 cpp考勤)。当读入0时输入结束,相应的结果不要输出。

输入样例:

Bob 10001 18 75.5 4
Mike 10005 17 95.0 5
0

输出样例:

10001 Bob 75.9
10005 Mike 95.5

#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

class Person {
protected:
     string name;
     int age;
public:
     Person();      
     Person (string p_name, int p_age)
	 {
		 this->name=p_name;
		 this->age=p_age;
	 }
     void display () {cout<<name<<":"<<age<<endl;}
};

class Student:public Person{
private:
	int ID;
	float cpp_score;
	float cpp_count;
	float cpp_grade;
public:
	Student(string name,int id,int age,float score,float count):Person(name,age)
	{
		this->ID=id;
		this->cpp_score=score;
		this->cpp_count=count;
		this->cpp_grade=this->cpp_score*0.9+this->cpp_count*2;
	}
	void print()
	{
		cout<<ID<<" "<<name<<" ";
		printf("%.1lf\n",cpp_grade);
	}
};

int main()
{
	string name;
	int id,age;
	float score,count;


	cin>>name;
	while(name!="0")
	{
		cin>>id>>age>>score>>count;
		Student s(name,id,age,score,count);
		s.print();
		cin>>name;
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值