- 继承后,构造派生类对象时,会先构造基类
(多继承中,按继承基类的顺序来构造)
当派生类继承了基类后,构造派生类的对象时会首先构造基类对象,多继承中,按派生类继承基类的顺序来构造,析构过程按构造的反向顺序析构
class A
{
public:
A()
{
cout << "A::A()" << endl;
}
~A()
{
cout << "A::~A()" << endl;
}
};
class D : public A
{
public:
D()
{
cout<<"D::D()"<<endl;
}
~D()
{
cout<<"D::~D()"<<endl;
}
};
void main()
{
D d;
}
以上代码的执行结果是:
A::A()
D::D()
D::~D()
A::~A()
- 当派生类继承的基类的构造方法有默认值的参数时
以下代码时可以正常执行的
//当派生类继承的基类的构造方法有默认值的参数,且派生类成员是基类对象时
class A
{
public:
A(int a = 0)
{
cout << "A::A()" << endl;
}
~A()
{
cout << "A::~A()" << endl;
}
private:
int a_data = 1; //C++11
};
class B
{
public:
B(int b = 0)
{
cout << "B::B()" << endl;
}
~B()
{
cout << "B::~B()" << endl;
}
};
class C
{
public:
C(int c = 0)
{
cout << "C::C()" << endl;
}
~C()
{
cout << "C::~C()" << endl;
}
};
class D : public C, public A, public B
{
public:
D()
{
cout << "D::D()" << endl;
}
~D()
{
cout << "D::~D()" << endl;
}
private:
A _a;
B _b;
C _c;
};
void main()
{
D d;
}
以上代码的执行结果是:
C::C()
A::A()
B::B()
A::A()
B::B()
C::C()
D::D()
D::~D()
C::~C()
B::~B()
A::~A()
B::~B()
A::~A()
C::~C()
通过以上执行结果可以再次可以证明 :
当派生类继承了基类后,构造派生类的对象时会首先构造基类对象,多继承中,按派生类继承基类的顺序来构造,析构过程按构造的反向顺序析构
- 当派生类继承的基类的构造方法有参数但无默认值,且派生类成员是基类对象时
必须在派生类的构造函数后面加上基类构造的初始化列表,如果派生类中有成员是基类对象时,在初始化列表中就需要给派生类基类对象成员初始化
//当派生类继承的基类的构造方法有参数但无默认值时
class A
{
public:
A(int a)
{
cout << "A::A()" << endl;
}
~A()
{
cout << "A::~A()" << endl;
}
private:
int a_data = 1; //C++11
};
class B
{
public:
B(int b)
{
cout << "B::B()" << endl;
}
~B()
{
cout << "B::~B()" << endl;
}
};
class C
{
public:
C(int c)
{
cout << "C::C()" << endl;
}
~C()
{
cout << "C::~C()" << endl;
}
};
class D : public C, public A, public B
{
public:
D() : B(2), A(1), C(3), _a(0), _b(0), _c(0)
{
cout << "D::D()" << endl;
}
~D()
{
cout << "D::~D()" << endl;
}
private:
A _a;
B _b;
C _c;
};
void main()
{
D d;
}
static
基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一
个static成员
class Base
{
public:
Base()
{
object_count++;
}
protected:
void fun()
{
object_count++;
}
public:
static int object_count;
};
int Base::object_count = 0;
class A : public Base
{};
class B : public Base
{};
void main()
{
A a;
cout<<a.object_count<<endl;
B b;
cout<<a.object_count<<endl;
cout<<b.object_count<<endl;
}
> 基类静态成员被所有对象(基类和派生类)共有