成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

C++重溫筆記(四): 繼承和派生

DevWiki / 1641人閱讀

摘要:繼承繼承,就是子類繼承父親的特征和行為,使得子類具有父類的成員變量和方法。此時,被繼承的類稱為父類或基類,而繼承的類稱為子類或派生類。,如果存在繼承關(guān)系的時候,和就不一樣了基類中的成員可以在派生類中使用,但是基類中的成員不能再派生類中使用。

1. 寫在前面

c++在線編譯工具,可快速進行實驗: https://www.dooccn.com/cpp/

這段時間打算重新把c++撿起來, 實習(xí)給我的一個體會就是算法工程師是去解決實際問題的,所以呢,不能被算法或者工程局限住,應(yīng)時刻提高解決問題的能力,在這個過程中,我發(fā)現(xiàn)cpp很重要, 正好這段時間也在接觸些c++開發(fā)相關(guān)的任務(wù),所有想借這個機會把c++重新學(xué)習(xí)一遍。 在推薦領(lǐng)域, 目前我接觸到的算法模型方面主要是基于Python, 而線上的服務(wù)全是c++(算法側(cè), 業(yè)務(wù)那邊基本上用go),我們所謂的模型,也一般是訓(xùn)練好部署上線然后提供接口而已。所以現(xiàn)在也終于知道,為啥只單純熟悉Python不太行了, cpp,才是yyds。

和python一樣, 這個系列是重溫,依然不會整理太基礎(chǔ)性的東西,更像是查缺補漏, 不過,c++對我來說, 已經(jīng)5年沒有用過了, 這個缺很大, 也差不多相當(dāng)重學(xué)了, 所以接下來的時間, 重溫一遍啦 ?

資料參考主要是C語言中文網(wǎng)光城哥寫的C++教程,然后再加自己的理解和編程實驗作為輔助,加深印象。

今天這篇文章是C++非常重要的一塊,關(guān)于類的繼承和派生,我們知道C++面向?qū)ο箝_發(fā)有四大特性: 抽象,封裝,繼承和多態(tài)。 前面發(fā)現(xiàn),通過定義類,把事物的數(shù)據(jù)和功能進行抽象,而通過隱藏對象的屬性和實現(xiàn)細節(jié),對外只提供接口的方式對類的內(nèi)部成員形成了封裝。 這兩個前面都已經(jīng)了解過, 而這篇文章主要是整理繼承,即子類繼承父類的特征和行為,使得子類具有父類的成員變量和方法, 繼承最大的一個好處就是代碼復(fù)用,兩個類有一些相同的屬性和方法。

這篇內(nèi)容會有些偏多,還是各取所需即可 ?

主要內(nèi)容如下:

  • C++繼承和派生初識
  • C++繼承的三種方式
  • C++繼承時的名字遮蔽問題與作用域嵌套
  • C++繼承時的對象內(nèi)存模型
  • C++基類和派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)
  • C++的多繼承
  • C++虛繼承(虛基類,虛繼承構(gòu)造函數(shù),虛繼承內(nèi)存模型)
  • C++向上轉(zhuǎn)型(派生類指針賦值給基類)與過程原理剖析
  • 借助指針突破訪問權(quán)限的限制

Ok, let’s go!

2. C++繼承和派生初識

2.1 C++面向?qū)ο箝_發(fā)的四大特性

在聊C++繼承和派生之前,先來看看C++面向?qū)ο箝_發(fā)的四大特性,這樣能先宏觀把握一下繼承到底位于什么樣的位置。

C++面向?qū)ο箝_發(fā)有四大特性: 抽象,封裝,繼承和多態(tài), 正所謂編程語言的背后都非常相似,Java既然也是面向?qū)ο蟮恼Z言,同樣也會有這四大特性。

抽象和封裝前面其實已經(jīng)整理過了, 封裝主要講的是信息隱藏,保護數(shù)據(jù),而抽象又可以從兩個層面來理解。

  • 抽象:
    從現(xiàn)實生活的具體事物到類層面的抽象(包括各個成員),比如人,有姓名,年齡等各個屬性,又有學(xué)習(xí),運動等各項功能,那么就可以定義people類把這些數(shù)據(jù)抽象出來,再通過創(chuàng)建對象的方式把具體實體人創(chuàng)建出來,調(diào)用相應(yīng)的方法實現(xiàn)相應(yīng)的功能。

    宏觀上,這是一種大層面的抽象,而這里面其實又可以看成數(shù)據(jù)抽象(目標的特性信息)和過程抽象(目標的功能是啥,注意不關(guān)注具體實現(xiàn)邏輯)
  • 封裝
    所謂封裝,就是隱藏對象的屬性和實現(xiàn)細節(jié),僅僅對外公開接口,控制程序?qū)︻悓傩缘淖x取和修改。在類的內(nèi)部, 成員函數(shù)可以自由修改成員變量,進行精確控制,但是在類的內(nèi)部,通過良好的封裝, 減少耦合,隱藏實現(xiàn)細節(jié)。
  • 繼承
    繼承,就是子類繼承父親的特征和行為,使得子類具有父類的成員變量和方法。 這個和生活中兒子繼承他爹的家產(chǎn)差不多是一個道理,更有意思的是繼承有兩種模式,單繼承和多繼承,單繼承比較好理解,一個子類只繼承一個父類, 而多繼承是一個子類,繼承多個父類,聯(lián)想到生活中,可能有好幾個爸爸。
  • 多態(tài)
    同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力,有兩種表現(xiàn)形式覆蓋和重載,這個到這里不理解也不要緊,下一篇文章會重點整理。
    • 重載: 這個之前學(xué)習(xí)過,相同作用域中存在多個同名函數(shù),但函數(shù)的參數(shù)列表會不一樣
    • 重寫或者叫覆蓋: 主要體現(xiàn)在繼承關(guān)系里面,子類重寫了從他爸那里繼承過來的函數(shù),如果子類的對象調(diào)用成員函數(shù)的時候,如果子類的成員函數(shù)重寫了他爸的,那么就執(zhí)行子類自己的函數(shù),否則繼承他爸的。 這個也比較好理解,比如同樣是掙錢,他爸的路子很可能和兒子的不一樣,那么兒子在調(diào)用掙錢的時候,肯定是先找找兒子有沒有獨特的掙錢方式,如果沒有,就默認和他爸一樣,走他爸的掙錢方式。

2.2 再看繼承

有了上面的宏觀把握,再看繼承就比較容易理解, 簡單的講,繼承就是一個類從另一個類獲取成員變量和成員函數(shù)的過程。 此時,被繼承的類稱為父類或基類,而繼承的類稱為子類或派生類。

C++中派生和繼承是站在不同角度看的同種概念。繼承時從兒子的角度看,派生是父親的角度看,實際說的是一回事。

派生類除了擁有他爹的成員,還可以定義自己的新成員,增強功能,此時的好處就是只需要定義新成員即可,老的成員和功能,直接繼承,實現(xiàn)了代碼復(fù)用。

下面是兩種典型使用繼承的場景:

  1. 創(chuàng)建的新類與現(xiàn)有類相似,只多出若干個成員變量和成員函數(shù)的時候,用繼承,減少代碼量,且新類會擁有基類的所有功能
  2. 創(chuàng)建多個類, 他們擁有很多相似的成員變量或函數(shù),可以用繼承,把這些類共同的成員提取出來,定義為基類,然后從基類繼承, 可以減少代碼量,也方便后續(xù)的修改。

繼承的語法:

class 派生類名:[繼承方式] 基類名{    派生類新增加的成員};

直接看個栗子:

class People{public:    void setname(string name);    string getname();private:    string m_name;    int m_age;};void People::setname(string name){m_name = name;}   string People::getname(){return m_name;}class Student: public People{public:    void setage(int age);    int getage();private:    int m_age;};void Student::setage(int age){m_age = age;}int Student::getage(){return m_age;}int main(){    Student stu;    stu.setname("zhongqiang");    stu.setage(25);    cout << stu.getname() << "的年齡是" << stu.getage() << endl;    return 0;}

這個例子比較簡單,不解釋, 這里就會發(fā)現(xiàn), Student繼承了People之后,就有他的setname()getname()方法,在子類里面可以直接調(diào)用。

上面演示了public的繼承方式,但繼承方式其實有3種, public, private, protected, 這哥仨不僅可以修飾類的成員,還可以指定繼承方式。如果不寫,默認是private(成員變量和成員函數(shù)默認也是private), 那么這三種繼承方式到底有啥區(qū)別呢?

3. C++繼承的三種方式

3.1 哥仨修飾類成員

public, private, protected這哥仨,可以修飾類成員,之前見識過public和private了, 這里加上protected之后統(tǒng)一整理下訪問權(quán)限的問題。

類成員的訪問權(quán)限從高到低依次是public --> protected --> private。 public成員可以通過對象來訪問, private成員不能通過對象訪問, protected成員和private成員蕾西, 也不能通過對象訪問。

But, 如果存在繼承關(guān)系的時候, protected和private就不一樣了: 基類中的protected成員可以在派生類中使用,但是基類中的private成員不能再派生類中使用。

3.2 繼承方式會影響基類成員在派生類中的訪問權(quán)限

不同的繼承方式使得基類成員在派生類中的訪問權(quán)限也不一樣, 下面這個很重要:

  • public繼承方式
    • 基類中所有public成員 -> 繼承到派生類 -> public屬性
    • 基類中所有protected成員 -> 繼承到派生類 -> protected 屬性
    • 基類中所有private 成員 -> 繼承到派生類 -> 不能使用
  • protect繼承方式
    • 基類中所有public成員 -> 繼承到派生類 -> protected屬性
    • 基類中所有protected成員 -> 繼承到派生類 -> protected 屬性
    • 基類中所有private 成員 -> 繼承到派生類 -> 不能使用
  • private繼承方式
    • 基類中所有public成員 -> 繼承到派生類 -> private屬性
    • 基類中所有protected成員 -> 繼承到派生類 -> private 屬性
    • 基類中所有private 成員 -> 繼承到派生類 -> 不能使用

使用方法:

  1. 基類成員在派生類中的訪問權(quán)限不得高于繼承方式中指定的權(quán)限,也就是說**繼承方式中的public, protected, private是用來指明基類成員在派生類中最高訪問權(quán)限的。
  2. 不管繼承方式如何, 基類中的private成員在派生類中始終不能使用(不能在派生類的成員函數(shù)中訪問或者調(diào)用)
  3. 如果希望基類的成員能夠在派生類繼承并且使用, 那么這些成員應(yīng)該聲明public或者protected, 只有那些不希望在派生類中使用的成員聲明為private
  4. 如果希望基類的成員既不向外暴露(不能通過對象訪問), 還能在派生類中使用, 那么就聲明為protected。

下面通過上面的代碼例子來演示下, 由于private和protect繼承方式會改變基類成員在派生類中的訪問權(quán)限,導(dǎo)致繼承關(guān)系復(fù)雜, 所以實際開發(fā)中一般使用public。

把上面的栗子修改下, 測試下上面的這幾種情況,方便理解,這里只看public繼承下面的。

class People{public:    void setname(string name);    string getname();    void setage(int age);    int getage();    void setsex(string sex);    string getsex();    void setwork(string work);    string getwork();    // 屬性    string m_sex;    protected:    string m_work;    private:    string m_name;    int m_age;};void People::setname(string name){m_name = name;}   string People::getname(){return m_name;}void People::setage(int age){m_age = age;}int People::getage(){return m_age;}void People::setsex(string sex){m_sex=sex;}string People::getsex(){return m_sex;}void People::setwork(string work){m_work=work;}string People::getwork(){return m_work;}class Student: public People{public:        void setscore(float score);    float getscore();        // 定義問候方法,這里面會訪問基類的私有屬性    string helloname();    string hellowork();    string hellosex();private:    float m_score;};void Student::setscore(float score){m_score = score;}float Student::getscore(){return m_score;}// 訪問基類中的公有屬性string Student::hellosex(){return "hello, " + m_sex;}// 訪問基類中的protect屬性string Student::hellowork(){return "hello, " + m_work;}// 訪問基類中的私有屬性// string Student::helloname(){return "hello, " + m_name;}  error: "std::string People::m_name" is private within this contextint main(){        Student stu;    stu.setname("zhongqiang");    stu.setsex("man");    stu.setwork("student");    stu.setage(25);    stu.setscore(66.6);        cout << stu.getname() << "今年" << stu.getage() << ",性別: " << stu.getsex() << ", 職業(yè): " << stu.getwork() << ", 分數(shù): " << stu.getscore() << endl;        //cout << stu.helloname() << endl;    cout << stu.hellowork() << endl;    cout << stu.hellosex() << endl;        // 直接通過對象訪問屬性    cout << stu.m_sex << endl;     // 公有屬性到子類中依然是公有, 可以被訪問    //cout << stu.m_name << endl;  // error "std::string People::m_name" is private within this context    //cout << stu.m_work << endl;   // error "std::string People::m_work" is protected within this context        //cout << stu.m_score << endl;  // error "float Student::m_score" is private within this context        return 0;}

在這里面就可以看出來, 在Student里面的成員函數(shù)中,只能訪問到他爹的public屬性和protect屬性,不能訪問他爹的private屬性。而如果是通過Student的對象, 那么只能訪問public屬性,protect和private的都訪問不到。

在派生類中訪問基類的private成員的唯一方法就是借助基類的非private成員函數(shù),如果基類沒有非private成員函數(shù),那么該成員在派生類中將無法訪問。

這里注意一個問題,這里說的是基類的 private 成員不能在派生類中使用,并不是說基類的 private 成員不能被繼承。實際上,基類的 private 成員是能夠被繼承的,并且(成員變量)會占用派生類對象的內(nèi)存,它只是在派生類中不可見,導(dǎo)致無法使用罷了。private 成員的這種特性,能夠很好的對派生類隱藏基類的實現(xiàn),以體現(xiàn)面向?qū)ο蟮姆庋b性。

3.3 using改變訪問權(quán)限

using關(guān)鍵字可以改變基類成員在派生類中的訪問權(quán)限, 比如將public改成private, protected改成public。

注意:using 只能改變基類中 public 和 protected 成員的訪問權(quán)限,不能改變 private 成員的訪問權(quán)限,因為基類中 private 成員在派生類中是不可見的,根本不能使用,所以基類中的 private 成員在派生類中無論如何都不能訪問

class People{public:    void setname(string name);    string getname();    void setage(int age);    int getage();    void setsex(string sex);    string getsex();    void setwork(string work);    string getwork();    // 屬性    string m_sex;    protected:    string m_work;    private:    string m_name;    int m_age;};void People::setname(string name){m_name = name;}   string People::getname(){return m_name;}void People::setage(int age){m_age = age;}int People::getage(){return m_age;}void People::setsex(string sex){m_sex=sex;}string People::getsex(){return m_sex;}void People::setwork(string work){m_work=work;}string People::getwork(){return m_work;}class Student: public People{public:        void setscore(float score);    float getscore();        // 定義問候方法,這里面會訪問基類的私有屬性    string helloname();    string hellowork();    string hellosex();        using People::m_work;       // 將m_work提升成public權(quán)限    private:    float m_score;    using People::m_sex;        // 將m_sex降低為private權(quán)限};void Student::setscore(float score){m_score = score;}float Student::getscore(){return m_score;}// 訪問基類中的公有屬性string Student::hellosex(){return "hello, " + m_sex;}// 訪問基類中的protect屬性string Student::hellowork(){return "hello, " + m_work;}// 訪問基類中的私有屬性// string Student::helloname(){return "hello, " + m_name;}  error: "std::string People::m_name" is private within this contextint main(){        Student stu;    stu.setname("zhongqiang");    stu.setsex("man");    stu.setwork("student");    stu.setage(25);    stu.setscore(66.6);        cout << stu.getname() << "今年" << stu.getage() << ",性別: " << stu.getsex() << ", 職業(yè): " << stu.getwork() << ", 分數(shù): " << stu.getscore() << endl;       // 直接通過對象訪問屬性    //cout << stu.m_sex << endl;     // 這個這時候就會報錯了    cout << stu.m_work << endl;   // 這個就可以訪問了    return 0;}

注意,using修改的是派生類里面的成員訪問權(quán)限。并且是只能修改public和protected的訪問權(quán)限。

4. C++繼承時的名字遮蔽問題與作用域嵌套

4.1 名字遮蔽問題

這個說的情況是派生類中的成員(變量和函數(shù)),如果和基類中的成員重名,那么在派生類中使用該成員,實際上用的是派生類新增的成員,而不是從基類繼承過來的。 即派生類遮蔽掉從基類繼承過來的成員。

下面的這個例子,是Student繼承了People, 又重寫了People的show函數(shù),那么通過Student對象調(diào)用show的時候,實際上是用的Student自身的show函數(shù),但People的show函數(shù)也被Student繼承了過來,如果想用,需要加上類名和域解析符。

class People{public:    void show();protected:    string m_name;    int m_age;};void People::show(){    cout << m_name << " " << m_age << endl; }class Student: public People{public:    Student(string name, int age, string sex);    void show();    // 遮蔽基類的show()    private:    string m_sex;};Student::Student(string name, int age, string sex): m_sex(sex){    m_name = name;    m_age = age;    //m_sex = sex;}void Student::show(){    cout << m_name << " " << m_age << " " << m_sex << endl;}int main(){        Student stu("zhongqiang", 25, "man");        // 派生類新增的成員函數(shù)    stu.show();        // zhongqiang 25 man        // 使用從基類繼承過來的成員函數(shù)    stu.People::show();  // zhongqiang 25        return 0;}

這里我在實驗的時候,發(fā)現(xiàn)個問題,就是Student的構(gòu)造函數(shù)定義的時候, 本來是想用構(gòu)造函數(shù)初始化列表的方式,一開始寫的代碼是這樣:

Student::Student(string name, int age, string sex): m_name(name), m_age(age){    m_sex = sex;}

此時編譯錯誤, 報錯原因class "Student" does not have any field named "m_name", 而如果寫成上面那種形式,或者不用參數(shù)化列表的方式,就沒問題, 所以這里我感覺,參數(shù)化列表那個地方的參數(shù),應(yīng)該是當(dāng)前類具有的成員變量才行, 繼承過來的應(yīng)該是不能往這里寫。

上面的例子,其實就是派生類對基類的函數(shù)重寫,內(nèi)部在執(zhí)行的時候, 先找派生類里面有沒有對應(yīng)的函數(shù),如果有,就先執(zhí)行派生類里面的重名函數(shù),如果沒有,那么再執(zhí)行基類里面定義的。

那么,如果派生類里面的函數(shù)和基類的函數(shù)重名,但形參列表不一樣的時候,此時會發(fā)生重載現(xiàn)象嗎? 答: 不會。 一旦派生類中有同名函數(shù),不管他們的參數(shù)是否一樣,都會把基類中所有的同名函數(shù)遮蔽掉。

這個就不用例子演示了,而是整理下背后的所以然吧。

4.2 作用域嵌套

之前整理過,每個類都會有自己的作用域, 在這個作用域內(nèi)會定義類的成員,那么,當(dāng)存在繼承關(guān)系的時候, 派生類的作用域嵌套在基類的作用域之內(nèi),如果一個名字在派生類的作用域沒有找到,編譯器會繼續(xù)到外層的基類作用域查找該名字的定義。

兩條:

  • 一旦在外層作用域中聲明或定義了某個名字, 那么它嵌套著的所有內(nèi)層作用域都能訪問這個名字
  • 同時,允許在內(nèi)層作用域重新定義外層作用域中已經(jīng)有的名字

看個嵌套作用域的例子:

class A{public:    void func();public:    int n = 500;};void A::func(){ cout<<"hello, changjinhu!!!"<<endl; }class B: public A{public:    int n = 5000;    int m;};class C: public B{public:    int n = 50000;    int x;};int main(){    C obj;    cout << obj.n << endl;    obj.func();    cout<<sizeof(C)<<endl;    return 0;}

這個例子中的繼承關(guān)系, B繼承A, C繼承B,那么作用域的嵌套關(guān)系如下:

  • obj是C類的對象, 訪問成員變量n時,由于C類自己有n, 那么編譯器就會直接用,此時不會去B或者A中找,即派生類中的成員變量會遮蔽基類中的成員變量。
  • 訪問成員函數(shù)func()的時候,編譯器沒有在C類里面找到func這個名字,會繼續(xù)到B作用域找,也沒有找到,再往外,從A里面找到了,于是,調(diào)用A類作用域的func()函數(shù)。
  • 對于成員變量,名字查找過程好理解,成員函數(shù)要注意,編譯器僅僅是根據(jù)函數(shù)名字查找,不理會函數(shù)參數(shù),所以一旦在內(nèi)層作用域找到同名函數(shù),不管有幾個,編譯器都不會再到外層作用域查找,編譯器僅僅把最內(nèi)層作用域的這些同名函數(shù)作為一組候選, 而也只有這組候選構(gòu)成一組重載函數(shù)。 即只有一個作用域內(nèi)的同名函數(shù)才會有重載關(guān)系,不同作用域的同名函數(shù)會造成遮蔽,外層函數(shù)會被內(nèi)層遮蔽掉, 這其實也是重載和重寫的一個區(qū)別了。

有了上面這些,就能回答上面的兩點疑問:

  1. 構(gòu)造函數(shù)的參數(shù)初始化列表那里, 初始化列表里面要列本類作用域里面的成員,如果是外層作用域,會報錯找不到成員
  2. 派生類和基類擁有不同的作用域,所以它們的同名函數(shù)不具有重載關(guān)系, 而是重寫或者覆蓋。

5. C++繼承時的對象內(nèi)存模型

沒有繼承時對象內(nèi)存的分布情況,成員變量和成員函數(shù)分開存儲:

  • 對象的內(nèi)存中只包含成員變量,存儲在棧區(qū)或者堆區(qū)(new創(chuàng)建)
  • 成員函數(shù)與對象內(nèi)存分離,存儲在代碼區(qū)

有繼承關(guān)系的時候, 派生類的內(nèi)存模型可以看成是基類成員變量和新增成員變量的總和,所有成員函數(shù)仍然存儲在另外一個區(qū)域–代碼區(qū),由所有對象共享。

看個例子:

class A{public:    A(int a, int b);protected:    int m_a;    int m_b;};A::A(int a, int b): m_a(a), m_b(b){}class B
            
                     
             
               

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/122560.html

相關(guān)文章

  • Java學(xué)習(xí)筆記1-開發(fā)環(huán)境安裝

    摘要:注意在完成配置環(huán)境變量后測試是否安裝成功時鍵入命令安裝出現(xiàn)了這樣的問題,需要升級具體安裝方法,可以參考該文檔教程下載最新的之后,上邊的問題就解決了。 由于其他項目中要使用Java的項目,所以,簡單的學(xué)下,好對項目有個大概的了解。 一、Eclipse 安裝 1.下載地址為: https://www.eclipse.org/downl... 2.配置環(huán)境 在配置環(huán)境變量中:設(shè)置JAVA_H...

    SimpleTriangle 評論0 收藏0
  • C++繼承

    摘要:基類中的構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被繼承,在派生類中需要定義新的構(gòu)造函數(shù)和析構(gòu)函數(shù),私有成員不能被繼承。對象訪問在派生類外部,通過派生類的對象對從基類繼承來的成員的訪問。 ...

    不知名網(wǎng)友 評論0 收藏0
  • C++繼承

    摘要:例如,在關(guān)鍵字為的派生類當(dāng)中,所繼承的基類成員的訪問方式變?yōu)?。繼承中的作用域在繼承體系中的基類和派生類都有獨立的作用域。為了避免類似問題,實際在繼承體系當(dāng)中最好不要定義同名的成員。 ...

    URLOS 評論0 收藏0
  • Python 3 學(xué)習(xí)筆記之——面向?qū)ο?/b>

    摘要:類的介紹類用來描述具有相同的屬性和方法的對象的集合。類變量類變量在整個實例化的對象中是公用的。類的定義語法格式如下類有一個名為的特殊方法,也即是構(gòu)造函數(shù),該方法會在定義對象的時候自動調(diào)用,可以通過參數(shù)傳遞來對類的實例進行設(shè)定。 1. 類的介紹 類(Class) 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例,類是對象的抽象。 ...

    yzzz 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<