返回:贺老师课程教学链接
(1)
#include <iostream> using namespace std; class Data { public: Data(int i):x(i) { cout<<"A"; } ~Data() { cout<<"B"; } private: int x; }; class Base { public: Base(int i):b1(i) { cout<<"C"; } ~Base() { cout<<"D"; } private: int b1; }; class Derived:public Base { public: Derived (int i,int j):Base(i),d1(j) { cout<<"E"; } ~Derived() { cout<<"F"; } private: Data d1; }; int main() { Derived obj(1,2); return 0; }
(2)
#include<iostream> using namespace std; class G { public: static int m; G( ) //构造函数 { m++; cout<<"G begins\n"; } ~G( ) { cout<<"G ends\n"; m--; } }; int G::m=0; class D:public G { public: D( ) //构造函数 { m++; cout<<"D begins\n"; } ~D( ) { cout<<"D ends\n" ; m-- ; } }; int main( ) { D objg; cout<<G::m<<endl; return 0; }
(3)
#include<iostream> using namespace std; class A { private: int x; protected: int y; public: int z; A(int a,int b,int c) { x=a; y=b; z=c; } int Getx() { return x; } int Gety() { return y; } void ShowA() { cout<< "x="<<x<<'\t'; cout<<"y="<<y<<'\t'; cout<<"z="<<z<<'\n'; } }; class B:public A //修改点(见后面阅读要求) { private: int m,n; public: B(int a,int b,int c,int d,int e):A(a,b,c) { m=d; n=e; } void Show() { cout<<"m="<<m<<'\t'<<"n="<<n<<'\n'; cout<<"x="<<Getx()<<'\t'; cout<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } int Sum() { return (Getx()+y+z+m+n); } }; int main() { B b1(1,2,3,4,5); b1.ShowA(); b1.Show(); cout<< "Sum="<<b1.Sum()<<'\n'; cout<<"x="<<b1.Getx()<<'\t'; cout << "y=" <<b1.Gety()<<'\t'; cout << "z="<<b1.z<<'\n'; return 0; }
先阅读程序,写出你预想的运行结果,再记录运行结果,如果两者有差异,再读程序给出解释。
观察基类A中成员的访问权限制以及派生类B中对这些成员的访问方法。
请将class B:public A 中的public改为protected或者删除,对程序进行编译,解释出现的情况。
(4)
#include <iostream>
using namespace std; class Part //部件类 { public: Part(); Part(int i); ~Part(); private: int val; }; Part::Part() { val=0; cout<<"调用Part的默认构造函数:"<<val<<endl; } Part::Part(int i) { val=i; cout<<"调用Part的构造函数: "<<val<<endl; } Part::~Part() { cout<<"调用Part的析构函数: "<<val<<endl; } class Whole: public Part { public: Whole(); Whole(int,int,int,int); ~Whole(); private: Part one; Part two; int data; }; Whole::Whole() { data=0; cout<<"调用whole的默认构造函数: "<<data<<endl; } Whole::Whole(int p, int i,int j,int k):Part(p),one(j),two(i),data(k) //问题2 { cout<<"调用whole的构造函数: "<<data<<endl; } Whole::~Whole() { cout<<"调用whole的析构函数: "<<data<<endl; } void f() { Whole w1; Whole w2(1,2,3,4); } int main() { f(); return 0; }
先分析程序的执行结果,在上机时运行程序进行对照,再通过单步执行跟踪程序的运行,达到理解基类、派生类中构造函数、析构函数执行过程的目的。
将Whole类的构造函数(见注释//问题2)改为下面形式,请解释出现的警告信息。
Whole::Whole(int p, int i,int j,int k): Part(p),two(i),one(j),data(k) //问题2
自选阅读:若还想通过运行程序的方式掌握继承机制的运行过程,阅读并运行下面的程序
(1)
#include <iostream> using namespace std; class A { public: A() { cout<<"A"; } ~A() { cout<<"~A"; } }; class B :public A { A *p; public: B() { cout<<"B"; p=new A(); } ~B() { cout<<"~B"; delete p; } }; int main() { B obj; return 0; }
(2)
#include <iostream> using namespace std; class A { protected: int x; public: A(int x) { A::x=x; cout<<"class A"<<endl; } }; class B { private: A a1; public: B(int x):a1(x) { cout<<"class B"<<endl; } }; class C:public B { private: A a2; public: C(int x):B(x),a2(x) { cout<<"class C"<<endl; } }; class D:public C { public: D(int x):C(x) { cout<<"class D"<<endl; } }; int main() { D dobj(10); return 0; }
(3)
#include<iostream> using namespace std; class my_base { int a,b; public: my_base(int x,int y) { a=x; b=y; } virtual void show() { cout<<"base"; cout<<a<<" "<<b<<endl; } }; class my_class: public my_base { int c; public: my_class(int x,int y,int z):my_base(x,y) { c=z; } void show() { cout<<"my_class "<<"c="<<c; } }; int main() { my_base mb(50,50),*mp; my_class mc(10,20,30); mp=&mb; mp->show(); mp=&mc; mp->show(); return 0; }
【阅读- 长颈鹿类对动物类的继承】理解基类中成员的访问限定符和派生类的继承方式
请在下面的程序中要求的位置写下注释,声明相应的语句在语法上是否正确,为什么。在第一个程序中给出了示例,其他位置请仿照完成。在上机时,可以编译程序加以验证,阅读错误给出的英文提示,并加以理解。
(1)public继承方式下
#include <iostream> using namespace std; class Animal //动物类 { public: Animal() {} void eat(){ cout << "eat\n"; } protected: void play() { cout << "play\n"; } private: void drink() { cout << "drink\n"; } }; class Giraffe: public Animal //长颈鹿类 { public: Giraffe() {} void StrechNeck() { cout << "Strech neck \n"; } private: void take() { eat(); // 正确,公有继承下,基类的公有成员对派生类可见 drink(); // _______________ play(); // _______________ } }; int main() { Giraffe gir; //定义派生类的对象 gir.eat(); // 正确,公有继承下,基类的公有成员对派生类对象可见 gir.play(); // _______________ gir.drink(); // _______________ gir.take(); // _______________ gir.StrechNeck(); // _______________ Animal ani; ani.eat(); // _______________ ani.play(); // _______________ ani.drink(); // _______________ ani.take(); //错误,派生类的成员对基类对象(不论访问属性)不可见 ani.StrechNeck(); // _______________ return 0; }
(2)private继承方式下
#include <iostream> using namespace std; class Animal { public: Animal() {} void eat() { cout << "eat\n"; } protected: void play() { cout << "play\n"; } private: void drink() { cout << "drink\n"; } }; class Giraffe: private Animal { public: Giraffe() {} void StrechNeck() { cout << "Strech neck \n"; } void take() { eat(); // _______________ drink(); // _______________ play(); // _______________ } }; int main() { Giraffe gir; gir.eat(); // _______________ gir.play(); // _______________ gir.drink(); // _______________ return 0; }
(3)protected继承方式下
#include <iostream> using namespace std; class Animal { public: Animal() {} void eat() { cout << "eat\n"; } protected: void play() { cout << "play\n"; } private: void drink() { cout << "drink\n"; } }; class Giraffe: protected Animal { public: Giraffe() {} void StrechNeck() { cout << "Strech neck \n"; } void take() { eat(); // _______________ drink(); // _______________ play(); // _______________ } }; int main() { Giraffe gir; gir.eat(); // _______________ gir.play(); // _______________ gir.drink(); // _______________ return 0; }
时间: 2024-09-29 15:10:22