C++ 重載、重寫、重定義的區別

月山知了 2022-07-23 21:27:17 阅读数:19

c++
#include <iostream>
using namespace std;
class Parent01 {

public:
Parent01() {

cout << "Parent01" << endl;
}
public:
void aaa() {

cout << "aaa" << endl;
}
void func() {

cout << "Parent01::void func()" << endl;
}
virtual void func(int i) {

cout << "Parent01:: void func(int i)" << endl;
}
virtual void func(int i, int j) {

cout << "Parent01:: void func(int i, int j)" << endl;
}
};
class Child01 : public Parent01 {

public:
// 此處2個參數,和子類func函數是什麼關系
void func(int i, int j) {

cout << "Child01:: void func(int i, int j): " << i + j << endl;
}
// 此處23個參數,和子類func函數是什麼關系
void func(int i, int j, int k) {

cout << "Child01:: void func(int i, int j, int k): " << i + j + k<< endl;
}
};
void run(Parent01* p) {

p->func(1, 2);
}
/* * 函數重載: * 必須在同一個類中進行 * 子類無法重載父類的函數,父類同名函數將被名稱覆蓋 * 重載是在編譯期間根據參數類型和個數决定函數調用 * * 函數重寫: * 必須發生在父類和子類之間 * 並且父類與子類中的函數必須有完全相同的原型 * 使用virtual聲明之後能够產生多態(如果不使用virtual,那叫重定義) * 多態是在運行期間根據具體對象的類型决定函數調用 */
// 在子類中不能重載父類的函數的,編譯器就是這麼做的。。順從即可。。
/* * 重寫的兩種情况: * 如果子類函數重寫,其父類中增加了virtual關鍵字,將能產生多態 * 如果子類函數重寫,其父類中沒有virtual關鍵字,相當於在子類中重定義,不會產生多態 */
void main() {

Parent01 p;
p.func();
p.func(1);
p.func(1, 2);
Child01 c;
c.aaa(); // 這個函數從父類繼承而來,可以被使用
// 原因:子類和父類有相同名字(變量名字或函數名字)時,子類名字覆蓋父類名字,如果想使用父類的資源,需要加::域作用符指定
// C2661 “Child01::func”: 沒有重載函數接受 0 個參數
//c.func(); // error 問題1 這個函數從父類繼承而來 為什麼這個不能被使用? 原因是發生了名稱覆蓋
c.Parent01::func();
c.func(1, 2);
run(&p);
run(&c);
system("pause");
}
版权声明:本文为[月山知了]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/204/202207232126049101.html