一文帶你學習C++中的派生機制
C++是一門面向?qū)ο蟮木幊陶Z言,其中的派生機制是其重要的面向?qū)ο筇匦灾?。派生是建立在現(xiàn)有類的基礎之上,創(chuàng)建一個新的類的過程。在新類中,可以利用父類中定義的變量和方法,并且可以添加新的成員變量和方法。
下面我們來詳細地學習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 {
// 包含新成員和覆蓋的函數(shù)等
};其中,Derived_class 是基于 Base_class 的派生類。access_specifier 表示派生類型,可以是 public、protected 或 private。新的成員和覆蓋的函數(shù)等是指在派生類中添加的成員和方法。
示例代碼如下:
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 函數(shù)中,分別創(chuàng)建了 Base 類和 Derived 類的對象并分別調(diào)用了它們的 print() 方法。結(jié)果顯示,派生類覆蓋了其基類的同名方法。
三、多重繼承
C++還支持多重繼承,即一個派生類從多個基類派生而來。具體地,可以這樣建立一個派生類:
class Derived : access_specifier Base1, access_specifier Base2, ... {
// 包含新成員和覆蓋的函數(shù)等
};
其中,Derived 是一個派生類,Base1、Base2 是兩個基類,可以有多個基類。access_specifier 表示該基類在派生類中的訪問權(quán)限,可以是 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 成員不能在派生類之外的成員函數(shù)中訪問
}
};
int main()
{
Derived d;
d.print();
return 0;
}上述代碼中,定義了兩個基類 Base1 和 Base2,分別有各自的方法 print1() 和 print2()。派生類 Derived 繼承自 Base1 和 Base2,由于 Base2 的訪問權(quán)限設置為 protected,在 Derived 中,只有成員函數(shù)可以訪問 Base2 中的成員。Derived 中定義的 print() 方法分別調(diào)用了 Base1 和 Base2 中的方法,結(jié)果顯示,多重繼承能夠在派生類中同時使用多個基類的成員,并進行靈活的訪問權(quán)限設置。
四、虛繼承
當一個類同時從多個基類繼承,而這些基類中又有共同的基類時,就會出現(xiàn)“二義性”的問題。為了解決這個問題,C++引入了虛繼承機制。
虛繼承使用關鍵字 virtual,它告訴編譯器,在繼承鏈中只保留一份共同的基類,從而避免了多次繼承造成的冗余。另外,虛繼承還規(guī)定了一個虛基類列表。虛基類列表中的類在繼承鏈中只繼承一次,并且會在最深層的派生類中進行初始化。
示例代碼如下:
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 函數(shù)中,我們創(chuàng)建了類 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 函數(shù)中,我們首先創(chuàng)建了一個 Derived 的對象 derived,可以看到它可以訪問由其基類 Base 中繼承的成員變量和方法。同時,我們?yōu)?derived 對象中定義了一個 additionalVar 成員,并定義了一個打印 additionalVar 的方法。接著,我們將 derived 對象賦值給了一個 Base 類型的引用 base,并通過 base 訪問了 Base 類中的成員變量和方法。結(jié)果顯示了派生類和基類之間的關系。
六、總結(jié)
本文介紹了C++中的派生機制,包括公有派生、保護派生、私有派生、多重繼承和虛繼承等。同時,文章還介紹了派生類和基類之間的關系。理解并掌握派生機制,可以提高我們在C++編程中的應用技能。
到此這篇關于一文帶你學習C++中的派生機制的文章就介紹到這了,更多相關C++派生機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
OpenCV實現(xiàn)區(qū)域分割和區(qū)域生長
區(qū)域分割是圖像處理中一個重要的任務,本文主要介紹了OpenCV實現(xiàn)區(qū)域分割和區(qū)域生長,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-02-02
C語言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復合類型,初始化的方法很多,那么小編下面對這些方法進行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-08
C語言實現(xiàn)模擬USB對8bit數(shù)據(jù)的NRZI編碼輸出
今天小編就為大家分享一篇關于C語言實現(xiàn)模擬USB對8bit數(shù)據(jù)的NRZI編碼輸出,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

