欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

运行结果

C++ 子类继承和调用父类的构造函数方法

相关标签: C++ c++