正确的说法是基类的普通成员函数可以被继承,可以通过派生类的对象访问,类的构造函数、析构函数不能被继承。而我的理解是构造函数被继承了,但它们的名字和派生类的名字是不一样的,不能成为派生类的构造函数,因此我们就要进行显示的调用基类的构造函数对基类继承过来的数据进行初始化。
派生类也是类,那么它的初始化也是调用构造函数来初始化,这时我们就可以定义派生类的构造函数,在里面添加对基类构造函数调用,这样我们就能够对派生类自己添加的数据成员进行初始化的同时,也能对有基类继承过来的数据成员进行初始化,即能对派生类的所有数据进行初始化了。
如下面的例子
-
#include <iostream>
using namespace std;
class A {
public:
A(int a = 0) :x(a) { }//构造函数void s() { cout << "x=" << x << endl; }
private:int x;
};
class D :public A {
public:
D(int a = 0, int b = 0) :A(a), z(b) { }//A(a)调用的是A类的A()这个构造函数,若基类有默认构造函数(有默认参数的构造函数或无参数的构造函数)也可不用显式调用,系统将自动调用基类的默认构造函数,即 D(int a = 0, int b = 0) :z(b) { } 当然如果没有默认构造函数,还不显式调用,那么将编译失败 ,注意类中已经显式定义了构造函数,编译器不会再生成默认的构造函数。void get() {
s();
cout << "z=" << z << endl;
}private:
int z;
};
int main()
{
A b(4); D c(5, 6);
cout << "A类"; b.s();
cout << "D类"<<endl;
c.get();
return EXIT_SUCCESS;}
运行结果为:
A类x=4
D类
x=5
z=6
请注意派生类定义的这一行D(int a = 0, int b = 0) :A(a), z(b) { }调用基类构造函数只能在派生类的参数初始化列表,它们之间以逗号隔开。如