11.3.3 另一种抽象类:类中只定义了protected型的构造函数

    对一个类来说,如果只定义了protected型的构造函数而没有提供public构造函数,无论是在外部还是在派生类中都不能创建该类的对象,但可以由其派生出新的类,这种能派生出新类,却不能创建自己对象的类是另一种形式的抽象类,代码11.8中便定义了一个构造函数为protected型的类。

    代码11.8 protected型的构造函数ProtectedConstructor


    <————————————-文件名:example1108.cpp——————————————> 01 #include<iostream> 02 using namespace std; 03 class Base//基类定义 04 { 05 private: 06 int x; 07 protected: 08 Base(int xp=0)//构造函数声明为protected型 09 { 10 x=xp; 11 } 12 public: 13 void disp() 14 { 15 cout<<"x is"<<x<<endl; 16 } 17 }; 18 class Child:public Base 19 { 20 public: 21 //Base b;错误,在派生类中不能创建Base类对象 22 Child(int xpp):Base(xpp)//但派生类中可调用protected构造函数 23 { 24 } 25 }; 26 int main() 27 { 28 Child c(1); 29 //Base b;错误,在外部不能创建Base类对象 30 c. disp(); 31 return 0; 32 }

    输出结果如下所示。


    x is 1

    【代码解析】代码第8行的Base类中只定义了一个protected型的构造函数,此时,无论在外部函数(如main函数)中还是在派生类中创建Base类的对象都是非法的,但是,由于protected型的构造函数可以在派生类中进行访问,因此,Base类可以派生出Child类。Base类是另一种形式的抽象类。