阅读下面类的定义,请说出在测试函数中不同情况的调用产生的结果
-
#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();
你认为输出结果是:__________ ____________
运行程序的结果是:______________________
(b)
-
b=a;
-
a.printA();
-
b.printA();
-
b.printB();
程序会发生编译错误,原因是:__________
记录下IDE中提示的错误并理解:_________
只能用子类对象对基类对象赋值,而不用基类对象对其子类对象赋值。
同一基类的不同派生类对象之间也不能赋值。
(c)
-
A &r1=a;
-
A &r2=b;
-
r1.printA();
-
r2.printA();
-
r2.printB();
将会发生错误的一行删除;
对余下的程序,你认为输出是:__________
实际运行的输出是:____________________
那一行的错误原因是:__________________
删除后运行结果:

(d)
-
A *p=&a;
-
p->printA();
-
p=&b;
-
p->printA();
-
p->printB();
将会发生错误的一行删除;
对余下的程序,你认为输出是:__________
实际运行的输出是:____________________
那一行的错误原因是:__________________
(e)
在class A中增加成员函数:
在main函数前增加一般函数:
-
void f(A x)
-
{
-
cout<<"aaaaah, my a: "<<x.getA()<<endl;
-
}
main函数中指定部分为:
你认为输出结果是:______________________
运行程序的结果是:______________________
补充阅读
-
#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;
-
}
运行结果:
总体来说,结合了组合和继承的c++类中,构造函数和析构函数的调用顺序具有以下规律:
1、对于继承:如果有基类,首先构造指定类的基类;
2、对于组合:按照嵌入的成员对象的声明顺序构造它们,成员对象构造完成后再构造封装它们的这个类;
3、构造和析构本身依赖于压栈和出栈,因此析构函数的函数的调用应该遵循栈的特性,以“后进先出”为原则——析构函数的调用与构造函数完全相反,先构造的后析构,后构造的先析构;
第十二周 阅读项目 (5)
原文:http://blog.csdn.net/wh201458501106/article/details/46316205