繼承與多態(tài)的概念
面向?qū)ο笕笤瓌t:封裝、繼承、多態(tài)。
-
繼承是一種機制,通過它一個類可以從另一個類繼承屬性和方法。派生類(子類)繼承基類(父類)的成員函數(shù)和數(shù)據(jù)成員,并且可以在其基礎(chǔ)上擴展自己的成員函數(shù)和數(shù)據(jù)成員。C++支持多重繼承,即一個派生類可以同時從多個基類中繼承。
-
多態(tài)是指同一種操作作用于不同的對象上面,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。在C++中,實現(xiàn)多態(tài)需要借助虛函數(shù)。虛函數(shù)是在基類中聲明的函數(shù),派生類可以對其進行重寫,從而實現(xiàn)不同的功能。當(dāng)通過指向基類的指針或引用調(diào)用虛函數(shù)時,程序會根據(jù)實際指向的對象類型來調(diào)用相應(yīng)的函數(shù),這種行為稱為動態(tài)綁定,即在運行時確定調(diào)用的函數(shù)。
繼承與多態(tài)的區(qū)別與聯(lián)系
繼承是指子類從父類繼承屬性和方法的過程,子類可以重寫(override)父類的方法,以實現(xiàn)自己的特定功能。繼承可以簡化代碼,減少重復(fù)的代碼量,并且可以通過繼承實現(xiàn)代碼的復(fù)用。
多態(tài)是指同一種方法在不同對象上產(chǎn)生不同的行為。在多態(tài)的實現(xiàn)中,通常采用父類指針指向子類對象的方式,這樣就可以通過父類指針調(diào)用子類方法,實現(xiàn)不同的行為。多態(tài)可以提高代碼的靈活性和可擴展性,使得程序更易于維護和擴展。
區(qū)別:
-
繼承是一種代碼復(fù)用的方式,可以從父類繼承屬性和方法;多態(tài)則是一種代碼執(zhí)行的方式,同一個方法在不同對象上有不同的行為。
-
繼承是一種靜態(tài)的關(guān)系,類在編譯時就確定了其繼承關(guān)系;多態(tài)則是一種動態(tài)的關(guān)系,運行時才能確定具體的行為。
-
繼承是一種自上而下的設(shè)計方式,父類是子類的模板;多態(tài)則是一種自下而上的設(shè)計方式,子類決定了父類的行為。
聯(lián)系:
-
繼承和多態(tài)都是面向?qū)ο缶幊痰闹匾拍?,它們都是實現(xiàn)代碼復(fù)用、提高代碼靈活性和可擴展性的重要方式。
-
多態(tài)需要繼承作為前提,因為父類指針可以指向子類對象,才能實現(xiàn)多態(tài)的效果。
示例
#include <iostream>
using namespace std;
// 基類
class Shape {
protected:
int width, height;
public:
Shape( int a = 0, int b = 0) {
width = a;
height = b;
}
virtual int area() {
cout << "Parent class area :" <<endl;
return 0;
}
};
// 派生類
class Rectangle: public Shape {
public:
Rectangle( int a = 0, int b = 0):Shape(a, b) { }
int area () {
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
// 派生類
class Triangle: public Shape{
public:
Triangle( int a = 0, int b = 0):Shape(a, b) { }
int area () {
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
int main( ) {
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// 存儲矩形的地址
shape = &rec;
// 調(diào)用矩形的求面積函數(shù) area
shape->area();
// 存儲三角形的地址
shape = &tri;
// 調(diào)用三角形的求面積函數(shù) area
shape->area();
return 0;
}
結(jié)果:
可以看到,程序中定義了一個基類 Shape 和兩個派生類 Rectangle 和 Triangle,兩個派生類公有繼承基類的屬性和方法,并且重寫了基類的虛函數(shù) area()。在 main() 函數(shù)中,首先創(chuàng)建了一個指向基類的指針 shape,然后將其分別指向 Rectangle 和 Triangle 對象。最后通過指針調(diào)用虛函數(shù)。shape指針兩次調(diào)用area方法,但是由于該指針指向的是不同對象,他會根據(jù)對象的類型來輸出不同的結(jié)果,這就是多態(tài)。
繼承和訪問的權(quán)限
在 C++ 中,類繼承分為三種類型:public、protected 和 private。它們分別表示基類成員在派生類中的訪問權(quán)限:
-
public 繼承:基類中的 public 成員在派生類中仍然是 public 的,基類中的 protected 成員在派生類中仍然是 protected 的,基類中的 private 成員仍然是私有的,private成員不能被派生類訪問。
-
protected 繼承:基類中的 public 成員在派生類中變成 protected 的,基類中的 protected 成員在派生類中仍然是 protected 的,并且只能被他的派生類成員函數(shù)和友元函數(shù)所訪問,基類中的 private 成員不能被派生類訪問。
-
private 繼承:基類中的 public 和 protected 成員在派生類中變成 private 的,基類中的 private 成員不能被派生類訪問。
說明
class Base {
public:
int a;
protected:
int b;
private:
int c;
};
class Derived1 : public Base {
// a是public的,b是protected的,c不能訪問
};
class Derived2 : protected Base {
// a是protected的,b是protected的,c不能訪問
};
class Derived3 : private Base {
// a是private的,b是private的,c不能訪問
};
示例:
#include <iostream>
using namespace std;
class Parent {
public:
void publicMethod() {
cout << "This is a public method of Parent class." << endl;
}
protected:
void protectedMethod() {
cout << "This is a protected method of Parent class." << endl;
}
private:
void privateMethod() {
cout << "This is a private method of Parent class." << endl;
}
};
class Child : public Parent {
public:
void callParentMethods() {
publicMethod(); // 公有方法可以在子類中直接訪問
protectedMethod(); // 保護方法可以在子類中直接訪問
// privateMethod(); // 私有方法不能在子類中直接訪問
}
};
int main() {
Child childObj;
childObj.publicMethod(); // 公有方法可以在子類對象中直接訪問
// childObj.protectedMethod(); // 保護方法不能在子類對象中直接訪問
// childObj.privateMethod(); // 私有方法不能在子類對象中直接訪問
childObj.callParentMethods(); // 子類中的方法可以調(diào)用父類的公有和保護方法
return 0;
}
在這個示例程序中,Parent類有三個成員方法,分別為publicMethod()、protectedMethod()和privateMethod(),它們的訪問權(quán)限分別為public、protected和private。Child類繼承了Parent類,并在其中定義了一個方法callParentMethods(),用于調(diào)用Parent類的publicMethod()和protectedMethod()方法。在main函數(shù)中,我們創(chuàng)建了一個Child類的對象childObj,并演示了不同的訪問方式和權(quán)限。
結(jié)果
從這個示例程序中可以看出,public成員可以在任何地方被訪問,包括在子類中和子類對象中;protected成員只能在子類和子類對象中被訪問;private成員只能在類的內(nèi)部被訪問,包括子類中也不能訪問。
**提示:**如果把繼承方式改為私有繼承或保護繼承,那么main函數(shù)中的
childObj.publicMethod();
語句也會報錯,因為保護或私有繼承過來之后,公有方法的權(quán)限就變了,子類對象不能訪問私有或保護的方法,那就更不能訪問基類的公有方法了。文章來源:http://www.zghlxwxcb.cn/news/detail-438317.html
結(jié)論
文章來源地址http://www.zghlxwxcb.cn/news/detail-438317.html
到了這里,關(guān)于【C++】繼承和多態(tài)、共有私有和保護、重寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!