
构造函数的调用顺序是从父类到子类;而析构函数则是从子类到父类,不信的话请编译并运行下面的代码:
#include <iostream>
using namespace std;
class TestClass
{
public:
TestClass() { cout << "The TestClass object has been constructed" << endl; }
~TestClass() { cout << "The TestClass object has been destructed" << endl; }
};
class SubClass : public TestClass
{
public:
SubClass() { cout << "The SubClass object has been constructed" << endl; }
~SubClass() { cout << "The SubClass object has been destructed" << endl; }
};
int main()
{
SubClass ob1 = new SubClass;
delete ob1; // destruct this object
system( "pause" );
return 0;
}
B没有print子函数,那么就调用A的print函数。
注意一点,A的print函数输出的是A的成员变量a
构造函数只是初始化了成员变量而已,但是你调用A的print,人家输出的就是A的成员变量a
而不是B的成员变量a。
B虽然继承了A,但是调用了A的成员函数,那么print中的变量依然是A的,而不是B的。
如果想实现你想的那种结果,那么你就要修改B的定义。
class B:public A
{
public:
int a;
B()
{
a=2;
}
};
你这么定义,实际的编译结果跟你想的是不一样的:
class B:public A
{
public:
int a;
int Aa;
B()
{
a=2;
}
A()
{
Aa = 1;
}
Aprint()
{
printf("%d",Aa);
}
};
上述的代码才是编译后的形式。这你应该懂了吧。
望采纳。
若你想得到你想象中的那种结果,那么你可以如此修改B
class B:public A
{
public:
/int a;/ //此行注释掉就可以了。
B()
{
a=2;
}
};
执行子类构造函数不可能不执行父类的构造函数。
当你实例化一个子类对象时,他会先执行SystemObject中的构造函数,然后再执行父类的构造函数,最后执行子类的构造函数。
要不执行父类的某个构造函数,只有你在子类中重载一个新的构造函数。
很容易理解,抽象类是需要被其他类继承的,这些子类是需要实例化的,实例化子类的时候是需要调用子类的构造函数的,而在默认情况下,在调用子类的构造函数前是先要调用基类的构造函数的,这一点和非抽象的类一样因为你实例化的不是抽象类而是抽象类的子类,这个并不矛盾
重写父类构造 Point(int a, int b) { setPoint(a, b); } JAVA规定构造类前必须完父类构造所必须写Point(int a, int b) { setPoint(a, b); } 父类默认参构造用写 public Point(){ }
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)