走进C++程序世界-私有继承

走进C++程序世界-----私有继承

私有继承:

   
在C++编程语言中,在声明一个派生类时将基类的继承方式指定为private的称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class),其基类称为私有基类(private base class)。
私有基类的公用成员和保护成员在私有派生类中的访问属性相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中称为不可访问的成员,只有基类的成员函数可以引用它们,一个基类成员在基类中的访问属性和在私有派生类中的访问属性可能是不相同的。私有基类的成员在私有派生类中的访问属性见下表:

私有基类中的成员
在私有派生类中的访问属性
私有成员
公用成员
保护成员
不可访问
私有
私有
 具体看下面的代码:
/*
 *private_interitance.cpp
 *Date : 2013-10-19
 *Author: sjin
 *Mail:413977243@qq.com
 */
#include <iostream>
using namespace std;
/*私有继承
 *基类的public protected 成员都以private身份出现在派生类中,但是基类
 *的private成员不可以访问。派生类的成员函数可以直接访问基类public protected
 *成员,但是不能访问积累的privated成员,派生类的对象不能访问基类的任何成员
 * */
/*基类:电动控制*/
class ElectricMotor{
public:
    ElectricMotor(){};
    virtual ~ElectricMotor(){};

public:
    void StartMotor(){
        Accelerate();
        Cruise();
    }

    void StopMotor(){
        cout << " Motor stopped" << endl;
    }

private:
    void Accelerate(){
        cout << " Motor started" << endl;
    }

    void Cruise(){
        cout << "Motor runnung at constant speed " << endl;
    }

};

/*派生类*/
class Fan : private ElectricMotor{
public:
    Fan(){};
    virtual ~Fan(){};

    void StartFan(){
        StartMotor();
    }

    void StopFan(){
        StopMotor();
    }

};

int main()
{
    Fan mFan;

    mFan.StartFan();
    mFan.StopFan();

    //mFan.Accelerate();
    //ElectricMotor * pmoto = &mFan;
    /*
    private_inheritance.cpp: In function ‘int main()’:
        private_inheritance.cpp:32: error: ‘void ElectricMotor::Accelerate()’ is private
        private_inheritance.cpp:65: error: within this context
        private_inheritance.cpp:65: error: ‘ElectricMotor’ is not an accessible base of ‘Fan’
        private_inheritance.cpp:66: error:
        */
}

输出:
Motor started
Motor runnung at constant speed 
 Motor stopped

在编译过程中中,如果main函数中最后2行注释去掉,会出现编译错误。具体错误信息主要违反了下面的原则:

基类的public protected 成员都以private身份出现在派生类中,但是基类的private成员不可以访问。派生类的成员函数可以直接访问基类public protected成员,但是不能访问积累的privated成员,派生类的对象不能访问基类的任何成员。