C++ 基类构造函数带参数的继承方式及派生类的初始化
2017-07-18 10:19
330 查看
在定义类的时候,会遇到基类的构造函数带参数,而子类子类构造函数不带参数,这时候如果以代码 a 的方式建立派生类则会出错。
代码 a:
在建立B类对象时,编译出错:
C:\Documents and Settings\admin\桌面\Text1.cpp(104) : error C2512: ‘A’ : no appropriate default constructor available
解决这个问题应该在A的构造函数中显式调用基类的带参构造函数。因为在基类中定义了带参构造函数,编译器不会提供默认构造函数。(或者可以在基类中增加一个不带参数的构造函数)这个问题将解决。
代码 b 采用的是调用基类带参构造函数的方式:
代码 b:
通过在基类中增加一个不带参数的构造函数:
代码 c:
综合例子:
代码 a:
class A { public: A(int x, int y):i(x),j(y){ } private: int i, j; }; class B:public A { public: B() { cout << "init B" << endl; } };
在建立B类对象时,编译出错:
C:\Documents and Settings\admin\桌面\Text1.cpp(104) : error C2512: ‘A’ : no appropriate default constructor available
解决这个问题应该在A的构造函数中显式调用基类的带参构造函数。因为在基类中定义了带参构造函数,编译器不会提供默认构造函数。(或者可以在基类中增加一个不带参数的构造函数)这个问题将解决。
代码 b 采用的是调用基类带参构造函数的方式:
代码 b:
class A { public: A(int x, int y) :i(x),j(y){ } private: int i, j; }; class B:public A { public: B():A(10,20) { cout << "init B" << endl; } }; //即在构造函数的后面增加一个冒号,后面是基类的构造函数。这种方式同样可以用来初始化类中的常量(初始化列表)。
通过在基类中增加一个不带参数的构造函数:
代码 c:
class A { public: A(int x, int y):i(x),j(y){ } A(); //不带参数的构造函数 private: int i, j; }; class B:public A { public: B():A(10,20) { cout << "init B" << endl; } };
综合例子:
#include <iostream> using namespace std; class A { public: A(int ii):i(ii){ cout<<"A::A()"<<endl; } ~A(){ cout<<"A::~A()"<<endl; } void print(){ cout<<"A::print() "<<i<<endl; } void print(int i){ cout<<"now i ="<<i<<endl; print(); } void set(int ii){ i = ii; cout<<"set("<<i<<")"<<endl; } private: int i; }; class B : public A { public: B(int a):A(15),t(a){ //父类构造函数有参数,子类构造的时候需对父类进行初始化 cout<<"B::B()"<<endl; } ~B(){ cout<<"B::~B()"<<endl; } void print(){ cout<<"B::print()"<<endl; } void f(){ cout<<t<<endl; set(20); //i = 10; error: public继承不能直接修改基类里的private成员 print(); } private: int t; }; //public继承,可以访问,不能直接修改基类里的private成员. int main() { B b(1000); b.f(); b.print(); b.set(10); cout<<"test beginning!"<<endl; b.print(); b.f(); b.A::print(200); //C++在父类和子类同时定义了一个函数名和参数表都一样的时候,只有子类一个函数,父类的同名函数全部被隐藏 cout<<"test over!"<<endl; return 0; }
相关文章推荐
- C++ 基类构造函数带参数的继承方式及派生类的初始化
- C++中三种不同的继承方式(public、protected、private)的基类特性和派生类特性
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
- C++第十二周【任务1】理解基类中成员的访问限定符和派生类的继承方式
- 第十二周C++【任务1】理解基类中成员的访问限定符和派生类的继承方式
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
- C++不同继承方式的基类和派生类特性
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
- 《C++第十二周实验报告1-1》----理解基类中成员的访问限定符和派生类的继承方式
- C++第十三周任务-项目一(理解基类中成员的访问限定符和派生类的继承方式)
- 关于c++中派生类构造函数初始化基类的记录
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
- 理解基类中成员的访问限定符和派生类的继承方式
- 5月8日实验报告(一)理解基类成员的访问限定符和派生类的继承方式
- C/C++开发语言系列之4---普通继承和虚基类构造函数的初始化顺序1
- 【C++】基类和派生类构造函数的调用顺序
- C++中通过继承来建立派生类的方式
- c++ 基类与派生类的构造函数
- C++ 基类和派生类之间构造函数的调用