且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

2015级C++第10、11周程序阅读(补充) 继承和派生

更新时间:2022-10-11 11:42:05

(1)

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

(2)

#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或者删除,对程序进行编译,解释出现的情况。

(3)

#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

(4)阅读程序,写出执行结果,并回答问题

#include<iostream>  
using namespace std; 
class A  
{  
public:  
   int n;  
};  
class B:public A {};   // class B:virtual public A{};  
class C:public A {};   // class C:virtual public A{};  
class D:public B,public C  
{  
public:
    int getn() {return B::n;}  
};  
int main()  
{  
   D d;  
   d.B::n=10;  
   d.C::n=20;
   cout<<d.getn()<<endl; 
   return 0;
}  

程序执行后,运行结果是多少?
将程序中有注释的两条语句修改为注释的内容,程序的运行结果又是多少?