C++三种继承方式--------共有继承(public)

首先看一段代码(0621_3.cpp):

#include <iostream>
using namespace std;

class A
{
private:
    int a;
protect:
    int b;
public:
    int c;
    void show()
    {
		cout << "a = " << a << "b = " << b << "c = " << c <<endl;
    }
	
    int set(int a,int b,int c)
    {
	this->a = a;
	this->b = b;
	this->c = c;
    }
};

class B : public A
{
private:
    int x;
protected:
    int y;
public:
    int z;
	
    void show()
    {
	cout << "a = " << a << "b = " << b << "c = " << c << "x = " << x << "y = " << y << "z = " << z <<endl;
    }
	
    int set(int a,int b,int c,int x,int y,int z)
    {
	this->a = a;
	this->b = b;
	this->c = c;
	this->x = x;
	this->y = y;
	this->z = z;
    }
};

int main()
{
    B b;
    b.set(10,20,30,40,50,60);
    b.show();
	
    cout << "a = " << b.a <<endl;
    cout << "b = " << b.b <<endl;
    cout << "c = " << b.c <<endl;
    cout << "x = " << b.x <<endl;
    cout << "y = " << b.y <<endl;
    cout << "z = " << b.z <<endl;

    return 0;
}

其实这段代码是编译不能通过的,编译信息如下:

该程序的错误原因在上面的错误信息中。描述的非常清楚,这主要是因为私有成员和保护成员非法访问错误,类的私有成员在对象中不可以被访问,同样在公有继承的子类中也不可以被访问父类私有成员。在子类中,如果想访问父类的私有成员,可以将父类的私有成员隐藏起来,对外公开一个共有访问该数据成员的接口函数。比如要在子类B中获取父类A的私有成员a的值,可以在父类A中增加一个共有接口函数,代码如下:

int get_a()
{
    return a;
}

     保护成员(protected修饰的成员)具备private和public部分属性。具体地说,protected修饰的类成员,在实例的对象中不可以被访问,这个特性和private相同。但是protected修饰的类成员在其派生的子类中是可以被访问的,这一点和public修饰成员相同。所以在类A中的protected属性的数据成员b,在其子类B中可以直接访问,但是在B的对象中不可以被访问,要想访问,可以像上面一样构造一个公共的接口。完整代码如下:


 

 
#include <iostream>
using namespace std;

class A
{
private:
    int a;
protected:
    int b;
public:
    int c;
    void show()
    {
		cout << "a = " << a << "b = " << b << "c = " << c <<endl;
    }
	
    int set(int a,int b,int c)
    {
	this->a = a;
	this->b = b;
	this->c = c;
    }
    
    int get_a()
    {
        return a;
    }

    int get_b()
    { 
        return b; 
    }
};

class B : public A
{
private:
    int x;
protected:
    int y;
public:
    int z;
	
    void show()
    {
	cout << "a = " << get_a() << "b = " << b << "c = " << c << "x = " << x << "y = " << y << "z = " << z <<endl;
    }
	
    int set(int a,int b,int c,int x,int y,int z)
    {
	A::set(a,b,c);
	this->x = x;
	this->y = y;
	this->z = z;
    }

    int get_x()
    { 
        return x;
    }

    int get_y()
    {
        return y;
    } 
};

int main()
{
    B b;
    b.set(10,20,30,40,50,60);
    b.show();
	
    cout << "a = " << b.get_a() <<endl;
    cout << "b = " << b.get_b() <<endl;
    cout << "c = " << b.c <<endl;
    cout << "x = " << b.get_x() <<endl;
    cout << "y = " << b.get_y() <<endl;
    cout << "z = " << b.z <<endl;

    return 0;
  }

关于共有继承总结:

      共有继承的特点是父类的公有成员(public)和保护成员(protected)都被子类继承,并且这些子类的属性保持不变,在子类中也可以访问父类的公有(public)或保护(protected)成员。父类的私有成员没被子类继承,并且不能在子类中访问父类私有成员。

      对于公有继承方式,必须搞清楚父类成员对于子类和子类对象的访问权限,或者说是可见的还是隐藏的。下面分两种情况总结。

      父类成员对于子类对象的可见性:父类的公有成员对于子类的对象来说是可见的,其他成员隐藏,不可以直接访问。这里父类的保护成员被访问的权限等同于私有成员。

      父类成员对子类的可见性:父类的公有成员和保护成员可见,而私有成员被隐藏,不可以直接访问。这里父类的保护成员被访问的权限等同于共有成员。


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章