第12周项目-程序阅读(2)

来源:互联网 发布:各区县地图json 编辑:程序博客网 时间:2024/05/22 07:44
<span style="font-size:12px;">#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;  }    (1)程序执行后,运行结果是多少?运行结果:10类D以类C和B为基类,但成员函数返回的是类B中的n,所以是10.(2)将程序中有注释的两条语句修改为注释的内容,即将“class B:public A {};”修改为“class B:virtual public A{};”,“class C:public A {}; ”修改为“class C:virtual public A{};”,重新编译运行程序,程序的运行结果又是多少?运行结果:20类D以类C和B为虚基类,类C和B继承类A,这样后,当基类被多条派生路径被一个派生类继承时,基类成员只保留一次,最后就只剩下n=20。
当类B和类C同时调用同一个基类时,只执行最后的派生类对虚类的构造函数的调用。(5)阅读下面类的定义,请说出在测试函数中不同情况的调用产生的结果#include <iostream>  using namespace std;  class A  {  protected:      int a,b;  public:      A(int aa, int bb):a(aa), b(bb) {}      void printA()      {          cout<<"a: "<<a<<"\tb: "<<b<<endl;      }  };  class B: public A  {      int c;  public:      B(int aa, int bb, int cc):A(aa,bb),c(cc) {}      void printB()      {          cout<<"a: "<<a<<"\tb: "<<b<<"\tc: "<<c<<endl;      }  };  int main()  {      A a(1,1);      B b(2,3,4);      //此处加入下面各小题中的代码      return 0;  }  (a)a=b;//将派生类的对象赋值给基类的对象 a.printA();  b.printA();  b.printB();  你认为输出结果是:a:2 b:3  a:2 b:3   a:2 b:3 c:4运行程序的结果是:a:2 b:3  a:2 b:3  a:2 b:3 c:4(b)b=a;  a.printA();  b.printA();  b.printB();  程序会发生编译错误,原因是:基类不能赋值给派生类 记录下IDE中提示的错误并理解:_no match for 'operator='in 'b=a;无法将a的值赋给b(c)A &r1=a;  A &r2=b;  r1.printA();  r2.printA();  r2.printB();  //错误将会发生错误的一行删除;对余下的程序,你认为输出是:a:1 b:1 a:2 b:3实际运行的输出是:a:1 b:1 a:2 b:3那一行的错误原因是:类A中没有printB成员函数。(d)A *p=&a;  p->printA();  p=&b;  p->printA();  p->printB();//错误  将会发生错误的一行删除;对余下的程序,你认为输出是:a:1 b:1 a:2 b:3实际运行的输出是:a:1 b:1 a:2 b:3那一行的错误原因是:类A中没有printB成员函数。(e)在class A中增加成员函数:int getA(){return a;}  在main函数前增加一般函数:void f(A x)  {      cout<<"aaaaah, my a: "<<x.getA()<<endl;  }  main函数中指定部分为:f(a);  f(b);  你认为输出结果是:aaaaah, my a:1                  aaaaah, my a:2运行程序的结果是:aaaaah, my a:1                  aaaaah, my a:2#include <iostream>  using namespace std;  class B  {  public:      B(int x=0)      {          X=x;          cout<<"B("<<x<<")\n";      }      ~B()      {          cout<<"~B()\n";      }      void print()      {          cout <<X<< " ";      }  private:      int X;  };      class D: public B  {  public:      D (int x, int y):B(x)      {          Y=y;          cout<<"D("<<x<<","<<y<<")\n";      }      ~D()      {          cout<<"~D()\n";      }      void print()   //与基类中的成员函数同名!这个冲突如何解决的?!      {          B::print(); //在成员函数前加上域名!         cout <<Y<<endl;      }  private:      int Y;  };  int  main()  {      D d(11,22);      d.print();      return 0;  }  </span>

0 0