南开原题

来源:百度知道 编辑:UC知道 时间:2024/06/07 04:23:09
#include<iostream.h>
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;
}/*1。南开原题,我照书打的,为什么编译错误?
2。我看书:构造函数不是不能通过继承被派生类获得吗?
只能通过在派生类中调用基类构造函数才能获得,
那为什么在这个例子中,并没有调用基类构造函数,
也一样能够输出ABA~B~A~A*/

第一个问题:错误是因为你的第一个p是大写的,后面是小写的。
第二个问题:如果在基类中没有定义构造函数,或者定义了无参的构造函数,那么在定义派生类构造函数时可以不写基类构造函数。因为此时派生类构造函数没有向基类构造函数传递参数的任务。在调用派生类构造函数时,系统会自动首先调用基类的默认构造函数。
如果在基类中既定义了无参的构造函数,也定义了有参的构造函数,则在定义派生类构造函数时,既可以包含基类构造函数,也可以不包含基类构造函数。
如果在基类中只定义了带参数的构造函数,那么就必须显式地定义派生类构造函数,并在派生类构造函数中写出基类的构造函数及其参数表。
可以在谭浩强的C++程序设计(04版372页)中找到

{A *P; 你这里声明的大写P,后面用的小写的

构造的时候会自动调用基类的构造函数的, 派生类是在基类的基础上构造