class Rectangle{
public:
Rectangle() :a(0), b(0){}
Rectangle(int x, int y) :a(x), b(y){}
public:
int a;
int b;
};
class Square :public Rectangle
{
public:
Square(int x):a(x) {}
};
首先注意一点就是:父类的成员变量必须设置为public,否则子类这边拿不到
现在分析一下子类创建一个对象的过程,首先在堆或者在栈中开辟出一块空间,空间的大小由子类本身的成员变量大小和父类的成员变量大小,如果有虚函数,第一个位置还要加上虚函数的指针。
然后所有变量对应的位置处全是垃圾值
注意有一点要求:标准要求,每个对象在其生命周期内只能被初始化一次. 这是一个非常显然的要求
主要原因还是在于:初始化列表是在定义这个变量的同时就对其进行初始化赋值。在子类调用它的构造函数之前,先调用父类的构造函数对成员变量进行初始化赋值。此时a变量已经初始化完了。此时调用子类的构造函数,发现需要再次对a变量进行初始化,但是a已经被初始化过了。
而如果是构造函数赋值的方式,调用子类的构造函数的时候,先对其赋予垃圾值,然后将x的值赋给变量a,此时不算是初始化了,算是再次赋值,是可以进行的。