继承和派生.docx
《继承和派生.docx》由会员分享,可在线阅读,更多相关《继承和派生.docx(16页珍藏版)》请在冰豆网上搜索。
继承和派生
继承性和派生类
8.1判断题
×1.派生类只继承基类中的公有成员和保护成员,而不继承私有成员。
×2.多重继承是指一个基类派生出多个派生类的情况。
√3.单重继承是指派生类只有一个基类的情况。
√4.派生类还可以作基类派生出新的派生类。
√5.派生类中成员的访问权限与基类的继承方式有关。
√6.继承反映了类之间“是”的关系,组合反映了类之间“有”的关系。
×7.基类中成员在派生类中都是可以访问的。
×8.私有继承中基类的私有成员在派生类中还是私有的。
√9.保护继承方式下基类的保护成员在派生类仍是保护成员。
8.2单选题
1.下列关于继承的描述中,错误的是(B)。
A.继承是重用性的重要机制
B.C++语言支持单重继承和双重继承
C.继承关系不是可逆的
D.继承是面向对象程序设计语言的重要特性
2.下列关于基类和派生类的描述中,错误的是(C)。
A.一个基类可以生成多个派生类
B.基类中所有成员都是它的派生类的成员
C.基类中成员访问权限继承到派生类中不变
D.派生类中除了继承的基类成员还有自己的成员
3.下列关于派生类的描述中,错误的是(D)。
A.派生类至少有一个基类
B.一个派生类可以作另一个派生类的基类
C.派生类的构造函数中应包含直接基类的构造函数
D.派生类默认的继承方式是public
4.派生类的对象可以直接访问的基类成员是(A)。
A.公有继承的公有成员B.保护继承的公有成员
C.私有继承的公有成员D.公有继承的保护成员
5.下列描述中,错误的是(D)。
A.基类的protected成员在public派生类中仍然是protected成员
B.基类的private成员在public派生类中是不可访问的
C.基类public成员在private派生类中是private成员
D.基类public成员在protected派生类中仍是public成员
6.派生类构造函数的成员初始化列表中,不能包含的初始化项是(B)。
A.基类的构造函数B.基类的子对象
C.派生类的子对象D.派生类自身的数据成员
7.下列关于子类型的描述中,错误的是(B)。
A.在公有继承下,派生类是基类的子类型
B.如果类A是类B的子类型,则类B也是类A的子类型
C.如果类A是类B的子类型,则类A的对象就是类B的对象
D.在公有继承下,派生类对象可以初始化基类的对象引用
8.3填空题
1.继承的3种方式是公有、私有和保护。
2.如果类A继承了类B,则类A被称为派生类,类B被称为基类。
3.在保护继承方式下,基类的public成员成为派生类的保护成员,基类的protected成员成为派生类的保护成员。
4.当一个派生类中含有子对象时,该派生类的析构函数中应包含直接基类的析构函数、子对象类的析构函数和自身类的析构函数。
8.4分析下列程序的输出结果
1.#include
classA
{
public:
A(inti,intj)
{a1=i;a2=j;}
voidMove(intx,inty)
{a1+=x;a2+=y;}
voidPrint()
{cout<<'('<private:
inta1,a2;
};
classB:
privateA
{
public:
B(inti,intj,intk,intl):
A(i,j)
{b1=k;b2=l;}
voidPrint()
{cout<voidf()
{A:
:
Print();}
voidfun()
{Move(5,8);}
private:
intb1,b2;
};
voidmain()
{
Aa(11,12);
a.Print();
Bb(31,32,33,34);
b.fun();
b.Print();
b.f();
}
答:
(11,12)
33.34
(36,40)
2.#include
classA
{
public:
voidInitA(inti,intj)
{a1=i;a2=j;}
voidMove(intx,inty)
{a1+=x;a2+=y;}
intGeta1()
{returna1;}
intGeta2()
{returna2;}
private:
inta1,a2;
};
classB:
publicA
{
public:
voidInitB(inti,intj,intk,intl)
{
InitA(i,j);
b1=k;
b2=l;
}
voidMove(intx,inty)
{b1+=x;b2+=y;}
intGetb1()
{returnb1;}
intGetb2()
{returnb2;}
private:
intb1,b2;
};
classC:
publicB
{
public:
voidfun()
{Move(10,15);}
};
voidmain()
{
Cc;
c.InitB(11,12,13,14);
c.fun();
cout<}
答:
11,12,23,29
3#include
classA
{
public:
A(inti):
a(i)
{cout<<"A:
constructorcalled.\n";}
~A()
{cout<<"A:
Destructorcalled.\n";}
voidPrint()
{cout<intGeta()
{returna;}
private:
inta;
};
classB:
publicA
{
public:
B(inti=0,intj=0):
A(i),a(j),b(i+j)
{cout<<"B:
Constructorcalled.\n";}
~B()
{cout<<"B:
Destructorcalled.\n";}
voidPrint()
{
A:
:
Print();
cout<
}
private:
intb;
Aa;
};
voidmain()
{
Bb1(8),b2(12,15);
b1.Print();
b2.Print();
}
答:
A:
constructorcalled.
A:
constructorcalled.
B:
Constructorcalled.
A:
constructorcalled.
A:
constructorcalled.
B:
Constructorcalled.
8
8,0
12
27,15
B:
Destructorcalled.
A:
Destructorcalled.
A:
Destructorcalled.
B:
Destructorcalled.
A:
Destructorcalled.
A:
Destructorcalled.
4.
#include
classA
{
public:
A(inti)
{cout<<"ConstructorinA."<
~A()
{cout<<"DestructorinA.\n";}
};
classB
{
public:
B(inti)
{cout<<"ConstructorinB."<
~B()
{cout<<"DestructorinB.\n";}
};
classC
{
public:
C(inti)
{cout<<"ConstructorinC."<
~C()
{cout<<"DestructorinC.\n";}
};
classD:
publicA,publicB,publicC
{
public:
D(inti,intj,intk,intl):
A(i),B(j),C(k),a(l)
{cout<<"ConstructorinD."<~D()
{cout<<"DestructorinD.\n";}
private:
Aa;
};
voidmain()
{
Dd(3,4,5,6);
}
答:
ConstructorinA.3
ConstructorinB.4
ConstructorinC.5
ConstructorinA.6
ConstructorinD.6
DestructorinD.
DestructorinA.
DestructorinC.
DestructorinB.
DestructorinA.
8.5编程题
1.按下列要求编程:
按照右边图中所示的各类的关系,编程输出它们的信息。
各类中的数据成员如下:
Person:
char*name(姓名),*dept(系别)
Student:
char*grade(年级)
Teacher:
char*lesson(授课名)
StudentTeacher(在职读研):
char*major(专业方向)
答:
编程如下:
#include
#include
classPerson
{
public:
Person(char*s)
{
name=newchar[strlen(s)+1];
strcpy(name,s);
}
voidPrint()
{cout<<"姓名:
"<protected:
char*name;
};
classStudent:
virtualpublicPerson
{
public:
Student(char*s,char*t):
Person(s)
{
grad=newchar[strlen(t)+1];
strcpy(grad,t);
}
voidPrint()
{
Person:
:
Print();
cout<<"年级:
"<}
protected:
char*grad;
};
classTeacher:
virtualpublicPerson
{
public:
Teacher(char*s,char*t):
Person(s)
{
lesson=newchar[strlen(t)+1];
strcpy(lesson,t);
}
voidPrint()
{
Person:
:
Print();
cout<<"授课名:
"<}
protected:
char*lesson;
};
classStudentTeacher:
publicStudent,publicTeacher
{
public:
StudentTeacher(char*p,char*q,char*r,char*s):
Student(p,q),Teacher(p,r),Person(p)
{
Major=newchar[strlen(s)+1];
strcpy(Major,s);
}
voidPrint()
{
Student:
:
Print();
cout<<"专业方向:
"<}
protected:
char*Major;
};
voidmain()
{
Studentstu("马宁","06级");
Teachertea("王新","高等代数");
StudentTeacherstutea("刘力","07级","数据结构","计算机软件");
stu.Print();
tea.Print();
stutea.Print();
}
2.设计一个程序,一行是信息,下一行画线,所画的线与信息行同长。
例如,
C++
Programming
答:
编程如下:
#include
#include
classLine
{
public:
Line(inti)
{length=i;}
voidShow()
{
for(inti=0;icout<<'_';
cout<}
private:
intlength;
};
classMessage
{
public:
Message(char*ptr)
{
msg=newchar[strlen(ptr)+1];
strcpy(msg,ptr);
}
~Message()
{delete[]msg;}
voidShow()
{
inti=0;
cout<}
private:
char*msg;
};
classMsgLine:
publicLine,publicMessage
{
public:
MsgLine(char*ptr):
Message(ptr),Line(strlen(ptr))
{}
voidShow()
{
Message:
:
Show();
Line:
:
Show();
}
};
voidmain()
{
MsgLinestring1("C++");
string1.Show();
MsgLinestring2("Progrmming");
string2.Show();
}
8.6简单回答下列问题
1.在继承关系中,派生类中包含基类所有成员,基类是否也包含派生类的部分成员?
答:
不包含。
2.构造函数不能继承,派生类的构造函数中是否应包含直接基类的构造函数和所有间接基类的构造函数?
签:
派生类的构造函数中只包含直接基类的构造函数。
3.派生类的析构函数中不包含直接基类的析构函数,对吗?
答:
不对。
4.派生类的对象可以给基类对象赋值吗?
答:
一般情况下不可以,只有在公有继承的情况下可以。