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; }}