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