4.【私有继承下访问基类的私有数据成员】
#include <iostream> using namespace std; class Base { private: int y; protected: int x; public: void setY() { cout << "结果为:y=" << 10 << endl; } void setX(int i) { x = i; } void show() { cout << "x=" << x << endl; } int getX() { return x; } }; class Drevid : private Base { public: void show1() { setY(); //会变成私有 } }; int main() { Base b; b.setX(10); b.show(); Drevid d; d.show1(); //派生类可以访问派生类 return 0; }
5.【私有继承下进一步派生】
#include <iostream> using namespace std; class Base { private: int y; protected: int x; void setY() { y=10; } public: void setX(int i) { x=i; } void show() { cout<<"x="<<x<<endl; } int getX() { return x; } }; class Drevid: private Base { public: void show1() { setY(); //基类中的保护会员变成私有成员 } }; class DDrevid: public Drevid //用公有继承的方式进一步派生后 { public: void f() { // setY(); 报错 //进一步派生后,仍然还是私有成员 } }; int main() { Base b; b.setX(10); b.show(); Drevid d; // d.setY(); 报错 //这个已经变成派生类的私有成员,在类外不能访问. d.show1(); DDrevid d1; d1.f(); //进一步派生后,仍然无法访问 return 0; }
6.【保护继承进一步派生】
#include <iostream> using namespace std; class Base { private: int y; protected: int x; void setY() { y = 10; } public: void setX(int i) { x = i; } void show() { cout << "x=" << x << endl; } int getX() { return x; } }; class Drevid : protected Base { public: void show1() { setY(); //基类中的保护成员会变成保护成员 } }; class DDrevid : public Drevid { public: void f() { setY(); //进一步派生后,公有继承下仍然是保护成员 } }; int main() { Base b; b.setX(10); b.show(); Drevid d; // d.setY(); 报错 //这个已经变成派生类的保护成员,在类外不能访问. d.show1(); DDrevid d1; d1.f(); //可以访问 return 0; }
(七)、派生类的构造函数
1.什么是派生类的构造函数:
1.派生类的数据成员既包括从基类继承的数据成员,也包括派生类新增的数据成员,甚至还可能包括派生类内定义的内嵌成员对象.
2.派生类构造函数在对派生类对象进行初始化时需要对基类数据成员,新增数据成员和内嵌对象成员进行初始化.
3.派生类会继承除基类构造函数外的所有基类成员,也就是说,(派生类是不能继承基类的构造函数的!!!)
4.在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须借助派生类的构造函数,调用基类的构造函数,从而结组基类的构造函数,从而借助基类的构造函数,来初始化从基类继承的数据成员.
5.如果派生类拥有对象成员时,派生类的构造函数还拥有对象成员所属类构造函数,来初始化这个对象成员.
2.派生类构造函数的格式(构造函数先基再派,析构函数先派后基)
(2).派生类的构造函数的定义格式:
派生类名::派生类名(): 类名(),内嵌对象成员名1…
{
派生类新增成员的初始化
}
(3).当基类中没有显示定义构造函数时,派生类的构造函数定义可以省略,系统采用默认的构造函数
(4).当基类定义了具有形参的构造函数时,派生类很可能也需要显示定义构造函数,提供将参数传递给基类构造函数的途径,使基类对象在初始化时可以获取相关数据,在某些情况下,派生类构造函数的函数体可能为空,仅起参数产地及调用基类与内嵌对象构造函数的作用
(5).派生类定义构造函数会自动调用基类构造函数
3.实列(派生类构造函数的初始化)
代码展示:
#include <iostream> using namespace std; class Inner { private: int y; public: Inner(int b) { y=b; cout<<"inner的构造函数:"<<y<<endl; } }; class Base { protected: int x; public: Base(int a) { x=a; cout<<"基类的构造函数:"<<x<<endl; } }; class Derived: public Base { private: Inner i; int z; public: Derived(int a,int b,int c):Base(a),i(b) //派生类构造函数,有内嵌,加派生类新增 { z=c; cout<<"派生类的构造函数:"<<z<<endl; } }; int main() { Base b(100); cout<<"*************************************"<<endl; Derived d(10,20,30); //+++++++++++++++ return 0; }
如有不解,随时支持私聊!!!!!