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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值