4.1 有哪几种继承方式?每种方式的派生类对基类成员的继承性如何?
公有继承,私有继承和保护继承。
基类的私有成员,无论哪种继承方式都不能访问。
公有继承不改变基类的公有和保护成员的访问限制。
私有继承将基类的公有和保护成员都变成私有。
保护继承将基类的公有和保护成员都变成保护。
4.2 派生类能否直接访问基类的私有成员?若否,应如何实现?
不能。可以在基类里添加一个公有成员函数来访问私有成员,派生类就能继承这个公有成员函数,实现对基类私有成员的访问。
4.3 保护成员有哪些特性?保护成员以公有方式或私有方式继承后的访问特性如何?
保护成员只能被本类或本类的派生类所访问,在类或派生类外是不能被访问的。
后面一问见第一题的答案。
4.4 派生类构造函数和析构函数的执行顺序是怎样的?
构造函数是先执行父类的构造函数,再执行类中其他类对象的构造函数,再执行本类的构造函数。如果同级有多个构造函数,则按声明顺序执行。
析构函数与构造函数的执行顺序刚好相反。
4.5 派生类构造函数和析构函数的构造规则是怎样的?
派生类名(参数总表) : 基类名(参数总表)
{
派生类新增数据成员的初始化语句
}
派生类中的析构函数与基类无关。
4.6 什么是多继承?多继承时,构造函数与析构函数的执行顺序是怎样的?
多继承是指一个类同时继承自多个不同的基类。
执行顺序同4.4
4.7 在类的派生中为何要引入虚基类?虚基类构造函数的调用顺序是如何规定的?
如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个简介的共同基类数据成员的多份同名成员。在访问这些同名成员的时候,会产生二义性。为了解决二义性,引入了虚基类。
1) 如果虚基类中定义有带形参的构造函数,并且没有定义默认形式的构造函数,则整个继承结构中,所有直接或间接的派生类都必须在构造函数的成员初始化表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员。
2) 建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。该派生类的其他基类对虚基类构造函数的调用都自动被忽略。
3) 若同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再调用非虚基类的构造函数,最后调用派生类的构造函数。
4.8-4.11 ACCB
4.12
Constructor B1.
Constructor B2.
Constructor A.
3
2
1
4.13
主食=bread
副食=steak
4.14
0,0,0
0,1,0
3,6,9
4.15
Constructor B1.
Constructor B2.
Constructor B3.
Constructor A.
1
2
4,3
4.16
4
4.17
(1,2)
5,6
(6,9)
4.18
class base1
class base2
class level2
class base2
class level1
class toplevel
4.19
#include <iostream> using namespace std; #include <iomanip> class table { public: table(int p, int q) { i = p; j = q; } void ascii(void); protected: int i, j; }; void table::ascii() { int k = 1; for(; i <= j; i++) { cout << setw(4) << i << " " << (char)i; if((k)%12 == 0) { cout << "\n"; } k++; } cout << "\n"; } class der_table:public table { public: der_table(int p, int q, char *m):table(p,q) { c = m; } void print(); protected: char *c; }; void der_table::print() { cout << c <<"\n"; table::ascii(); } int main() { der_table ob('a', 'z', "ASCII value---char"); ob.print(); return 0; }
4.20
#include <iostream> using namespace std; #include <iomanip> class area_c1 { protected: double height; double width; public: area_c1(double r, double s) { height = r; width = s; } virtual double area() = 0; }; class rectangle : public area_c1 { public: rectangle(double r, double s):area_c1(r, s){} virtual double area(); }; double rectangle::area() { return height * width; } class isosceles : public area_c1 { public: isosceles(double r, double s):area_c1(r, s){} virtual double area(); }; double isosceles::area() { return (height * width)/2; } int main() { rectangle r(10, 5); isosceles i(4, 6); area_c1 *a; a = &r; cout<< "矩形的面积是:" << a->area() << endl; a = &i; cout << "三角形的面积是:" << a->area() <<endl; return 0; }
4.21
#include <iostream> using namespace std; #include <iomanip> class Time { public: Time(int h, int m, int s) { hours = h; minutes = m; seconds = s; } void display() { cout << "出生时间:" << hours << "时" << minutes << "分" << seconds << "秒" << endl; } protected: int hours, minutes, seconds; }; class Date { public: Date(int m, int d, int y) { month = m; day = d; year = y; } void display() { cout << "出生年月:" << year << "年" << month << "月" << day << "日" << endl; } protected: int month, day, year; }; class Birthtime : public Time, public Date { public: Birthtime(char name[], int m, int d, int y, int h, int mi, int s): Time(h, mi, s), Date(m, d, y) { strcpy(Childname, name); } void showName() { cout << "我的名字是: " << Childname << endl; } private: char Childname[25]; }; int main() { Birthtime b("xiaoming", 3, 6, 2012, 11, 12, 42); b.showName(); b.Time::display(); b.Date::display(); return 0; }
4.22
#include <iostream> using namespace std; #include <iomanip> class person { protected: char number[25]; char name[25]; public: person(char num[], char na[]) { strcpy(number, num); strcpy(name, na); } void showName() { cout << "编号:" << number << " 姓名:" << name; } }; class student : public person { private: int classNumber, score; public: student(char num[], char na[], int cNumber, int sc):person(num, na) { classNumber = cNumber; score = sc; } void show() { showName(); cout << " 班号:" << classNumber << " 成绩:" << score << endl; } }; class teacher : public person { private: char title[25], department[25]; public: teacher(char num[], char na[], char tit[], char depart[]):person(num, na) { strcpy(title, tit); strcpy(department, depart); } void show() { showName(); cout << " 职称:" << title << " 部门:" << department << endl; } }