C++ 子类继承和调用父类的构造函数方法
程序员文章站
2022-05-14 09:06:15
...
子类的构造函数
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
子类构造函数的调用规则
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。
2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。
4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式。
特别的,对于6这种情况,我们可以使用子类构造函数:父类()的方法来调用父类的有参构造Son() :Base(1, 2, 3){}
例子
//父类Base
class Base {
public:
//父类的有参构造
Base(int a, int b, int c) : m_A(a), m_B(b), m_C(c) {
cout << "Base的有参构造" << endl;
}
~Base() {
cout << "Base的析构函数" << endl;
}
void printC() {
cout << m_C << endl;
}
void setC(int c) {
m_C = c;
}
int m_A;
protected:
int m_B;
private:
int m_C;
};
//子类Son
class Son : public Base {
public:
//子类Son调用父类的有参构造
Son() :Base(1, 2, 3) {
cout << "Son调用Base的有参构造" << endl;
}
public:
int m_D;
};
void test() {
Base b1(1, 2, 3);
b1.printC();
Son s1;
s1.Base::printC();
}
int main() {
test();
system("pause");
return 0;
}
运行结果
下一篇: Java类继承构造函数顺序依赖
推荐阅读
-
子类继承和覆盖父类的静态方法 解释了静态工厂方法不方便扩展
-
//继承中先调用父类构造函数再调用子类构造函数 //有点像入栈先进后出 后进先出
-
java中子类与父类中的静态代码块、非静态代码块和构造函数的加载顺序 博客分类: JAVA基础 静态代码块非静态代码块加载顺序
-
java中子类与父类中的静态代码块、非静态代码块和构造函数的加载顺序 博客分类: JAVA基础 静态代码块非静态代码块加载顺序
-
为什么在创建子类对象的时候会调用父类的构造函数
-
python中子类调用父类函数的方法示例
-
python中子类调用父类函数的方法示例
-
Java子类实例化总是默认调用父类的无参构造方法
-
类继承并重载其中函数后,怎么用子类对象调用重载前父类的函数
-
Java中子类调用父类构造方法的问题分析