您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++中的派生機制是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C++中的派生機制是什么”文章能幫助大家解決問題。
C++支持以下幾種派生類型:
1.公有派生: 在公有派生中,派生類可以訪問基類中的公有成員和受保護成員,但不能訪問基類中的私有成員。公有派生通常用于向基類添加新的特征和行為。
示例代碼如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : public Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成員可以在派生類中訪問 protected_var = b; //受保護成員可以在派生類中訪問 // private_var = c; //私有成員無法在派生類中訪問 } };
2.保護派生: 在保護派生中,派生類可以訪問基類中的公有成員和受保護成員,但不能訪問基類中的私有成員。保護派生通常用于繼承,即將基類的所有成員和方法都繼承到派生類中。
示例代碼如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : protected Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成員可以在派生類中訪問 protected_var = b; //受保護成員可以在派生類中訪問 // private_var = c; //私有成員無法在派生類中訪問 } };
3.私有派生: 在私有派生中,派生類可以訪問基類中的公有成員和受保護成員,但不能訪問基類中的私有成員。私有派生通常用于“隱藏”繼承,即對基類進行改進或擴展,但不公開基類的接口。
示例代碼如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : private Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成員可以在派生類中訪問 protected_var = b; //受保護成員可以在派生類中訪問 // private_var = c; //私有成員無法在派生類中訪問 } };
在C++中,派生的語法為:
class Derived_class : access_specifier Base_class { // 包含新成員和覆蓋的函數等 };
其中,Derived_class 是基于 Base_class 的派生類。access_specifier 表示派生類型,可以是 public、protected 或 private。新的成員和覆蓋的函數等是指在派生類中添加的成員和方法。
示例代碼如下:
class Base { public: void print() { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() { std::cout << "Derived" << std::endl; } }; int main() { Base b; Derived d; b.print(); //輸出 Base d.print(); //輸出 Derived return 0; }
上述代碼中,Base 類中定義了一個 print() 方法,輸出 Base。Derived 類繼承自 Base 類,并定義了一個同名的 print() 方法,輸出 Derived。在 main 函數中,分別創建了 Base 類和 Derived 類的對象并分別調用了它們的 print() 方法。結果顯示,派生類覆蓋了其基類的同名方法。
C++還支持多重繼承,即一個派生類從多個基類派生而來。具體地,可以這樣建立一個派生類:
class Derived : access_specifier Base1, access_specifier Base2, ... { // 包含新成員和覆蓋的函數等 };
其中,Derived 是一個派生類,Base1、Base2 是兩個基類,可以有多個基類。access_specifier 表示該基類在派生類中的訪問權限,可以是 public、protected 或 private。
示例代碼如下:
class Base1 { public: void print1() { std::cout << "Base1" << std::endl; } }; class Base2 { public: void print2() { std::cout << "Base2" << std::endl; } }; class Derived : public Base1, protected Base2 { public: void print() { print1(); //print2(); //private 成員不能在派生類之外的成員函數中訪問 } }; int main() { Derived d; d.print(); return 0; }
上述代碼中,定義了兩個基類 Base1 和 Base2,分別有各自的方法 print1() 和 print2()。派生類 Derived 繼承自 Base1 和 Base2,由于 Base2 的訪問權限設置為 protected,在 Derived 中,只有成員函數可以訪問 Base2 中的成員。Derived 中定義的 print() 方法分別調用了 Base1 和 Base2 中的方法,結果顯示,多重繼承能夠在派生類中同時使用多個基類的成員,并進行靈活的訪問權限設置。
當一個類同時從多個基類繼承,而這些基類中又有共同的基類時,就會出現“二義性”的問題。為了解決這個問題,C++引入了虛繼承機制。
虛繼承使用關鍵字 virtual,它告訴編譯器,在繼承鏈中只保留一份共同的基類,從而避免了多次繼承造成的冗余。另外,虛繼承還規定了一個虛基類列表。虛基類列表中的類在繼承鏈中只繼承一次,并且會在最深層的派生類中進行初始化。
示例代碼如下:
class Root { public: int i; }; class A : public virtual Root { public: int j; }; class B : public virtual Root { public: int k; }; class C : public A, public B { public: void sum() { i = j + k; } }; int main() { C c; c.j = 10; c.k = 20; c.sum(); std::cout << "Sum of j and k is " << c.i << std::endl; return 0; }
上述代碼中,定義了一個基類 Root,和兩個繼承了 Root 的派生類 A 和 B。類 C 同時從 A 和 B 繼承,它將 A 和 B 中的 i 合并為一份,并且在最深層的派生類 C 中進行初始化。在 main 函數中,我們創建了類 C 的對象 c,并對它的成員變量 j 和 k 賦值,并通過 sum() 方法計算它們的和。
派生類和基類之間存在以下關系:
派生類包含的成員都是派生類自己定義的,但它可以訪問基類的公有成員和受保護成員,也可以使用基類中的方法。
派生類的對象中包含了基類的對象,即派生類的對象中包含了基類對象的成員。
派生類的對象可以被看作是基類的對象,即派生類的對象可以直接賦值給基類對象。
示例代碼如下:
class Base { public: int publicVar; protected: int protectedVar; private: int privateVar; public: void print() { std::cout << "publicVar: " << publicVar << std::endl; std::cout << "protectedVar: " << protectedVar << std::endl; std::cout << "privateVar: " << privateVar << std::endl; } }; class Derived : public Base { public: int additionalVar; public: void printAdditionalVar() { std::cout << "additionalVar: " << additionalVar << std::endl; } }; int main() { Derived derived; derived.publicVar = 1; //derived.protectedVar = 2; //protected 成員不能直接在類外部訪問 derived.print(); //基類中的公有成員和受保護成員可以在派生類對象中訪問 derived.additionalVar = 3; derived.printAdditionalVar(); //派生類中的成員可以直接訪問 Base& base = derived; //派生類的對象可以賦值給基類對象 base.print(); //基類中的成員可以在基類對象中訪問 return 0; }
上述代碼中,定義了一個基類 Base 和一個派生類 Derived。在 main 函數中,我們首先創建了一個 Derived 的對象 derived,可以看到它可以訪問由其基類 Base 中繼承的成員變量和方法。同時,我們為 derived 對象中定義了一個 additionalVar 成員,并定義了一個打印 additionalVar 的方法。接著,我們將 derived 對象賦值給了一個 Base 類型的引用 base,并通過 base 訪問了 Base 類中的成員變量和方法。結果顯示了派生類和基類之間的關系。
關于“C++中的派生機制是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。