程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ 的三種訪問權限與三種承繼方式

C++ 的三種訪問權限與三種承繼方式

編輯:關於C++

C++ 的三種訪問權限與三種承繼方式。本站提示廣大學習愛好者:(C++ 的三種訪問權限與三種承繼方式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 的三種訪問權限與三種承繼方式正文


三種訪問權限

我們知道C++中的類,有三種訪問權限(也稱作訪問控制),它們辨別是public、protected、private。要了解它們其實也很容易,看上面了一個例子。

父類:

class Person
{
public:
Person(const string& name, int age) : m_name(name), m_age(age)
{
}
void ShowInfo()
{
cout << "姓名:" << m_name << endl;
cout << "年齡:" << m_age << endl;
}
protected:
string m_name; //姓名
private:
int m_age; //年齡
};
class Person
{
public:
Person(const string& name, int age) : m_name(name), m_age(age)
{
}
void ShowInfo()
{
cout << "姓名:" << m_name << endl;
cout << "年齡:" << m_age << endl;
}
protected:
string m_name; //姓名
private:
int m_age; //年齡
};

子類:

class Teacher : public Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見
cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};
class Teacher : public Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見
cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};

調用辦法:

void test()
{
Person person("張三", 22);
person.ShowInfo(); //public屬性,對內部可見
cout << person.m_name << endl; //protected屬性,對內部不可見
cout << person.m_age << endl; //private屬性,對內部不可見
}
void test()
{
Person person("張三", 22);
person.ShowInfo(); //public屬性,對內部可見
cout << person.m_name << endl; //protected屬性,對內部不可見
cout << person.m_age << endl; //private屬性,對內部不可見
}

總結

我們對C++類三種方式控制權限總結如下,這與Java中的三種對應的訪問權限是一樣的。

qq%e6%88%aa%e5%9b%be20161104113813

三種承繼方式

C++中承繼的方式還有多種,也辨別都用public、protected、private表示。這與Java不一樣,Java只要承繼的概念,默許是public承繼的。

1. 三種承繼方式不影響子類對父類的訪問權限,子類對父類只看父類的訪問控制權。

如上面三種承繼方式都能訪問父類中的public和protected成員。

class Teacher : /*public*/ /*protected*/ private Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見
//cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};
class Teacher : /*public*/ /*protected*/ private Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見
//cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};

2. 承繼方式是為了控制子類(也稱派生類)的調用方(也叫用戶)對父類(也稱基類)的訪問權限。

public承繼

class Teacher : public Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};
class Teacher : public Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};
void TestPublic()
{
Teacher teacher("李四", 35, "副教授");
teacher.ShowInfo();
cout << endl;
teacher.ShowTeacherInfo();
}
void TestPublic()
{
Teacher teacher("李四", 35, "副教授");
teacher.ShowInfo();
cout << endl;
teacher.ShowTeacherInfo();
}

後果:

姓名:李四
年齡:35

姓名:李四
年齡:35
職稱:副教授

private承繼:

class Teacher : private Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};
class Teacher : private Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};
void TestPrivate()
{
Teacher teacher("李四", 35, "副教授");
teacher.ShowInfo(); //錯誤,由於Teacher采用了private的承繼方式,內部不可訪問。
cout << endl;
teacher.ShowTeacherInfo();
}
void TestPrivate()
{
Teacher teacher("李四", 35, "副教授");
teacher.ShowInfo(); //錯誤,由於Teacher采用了private的承繼方式,內部不可訪問。
cout << endl;
teacher.ShowTeacherInfo();
}

3. public、protected、private三種承繼方式,相當於把父類的public訪問權限在子類中變成了對應的權限。

如protected承繼,把父類中的public成員在本類中變成了protected的訪問控制權限;private承繼,把父類的public成員和protected成員在本類中變成了private訪問控制權。

protected承繼:

class Teacher : protected Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};
class Teacher : protected Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的一切成員
}
private:
string m_title; //職稱
};
void TestProtected()
{
Teacher teacher("李四", 35, "副教授");
teacher.ShowInfo(); //錯誤,基類Person的ShowInfo此時對Teacher相當於protected的,內部不可以被訪問
cout << endl;
teacher.ShowTeacherInfo();
}
void TestProtected()
{
Teacher teacher("李四", 35, "副教授");
teacher.ShowInfo(); //錯誤,基類Person的ShowInfo此時對Teacher相當於protected的,內部不可以被訪問
cout << endl;
teacher.ShowTeacherInfo();
}
class Leader : public Teacher
{
public:
Leader(const string& name, int age, const string& title, string position)
: Teacher(name, age, title), m_position(position)
{
}
void ShowLeaderInfo()
{
ShowInfo(); //基類Person的ShowInfo此時相當於protected的,但子類仍可以訪問
ShowTeacherInfo(); //ShowTeacherInfo依然是public的,可以訪問
cout << m_position << endl;
}
private:
string m_position;
};
class Leader : public Teacher
{
public:
Leader(const string& name, int age, const string& title, string position)
: Teacher(name, age, title), m_position(position)
{
}
void ShowLeaderInfo()
{
ShowInfo(); //基類Person的ShowInfo此時相當於protected的,但子類仍可以訪問
ShowTeacherInfo(); //ShowTeacherInfo依然是public的,可以訪問
cout << m_position << endl;
}
private:
string m_position;
};

以上所述是給大家引見的C++ 的三種訪問權限與三種承繼方式,希望對大家有所協助,假如大家有任何疑問請給我留言,會及時回復大家的。在此也十分感激大家對網站的支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved