1. 程式人生 > >C++筆記 第四十七課 父子間的衝突---狄泰學院

C++筆記 第四十七課 父子間的衝突---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux

第四十七課 父子間的衝突

1.思考

子類中是否可以定義父類中的同名成員?如果可以,如何區分?如果不可以,為什麼?

47-1 同名成員變數

#include<iostream>
#include<string>
using namespace std;
class Parent
{
public:
    int mi;
};
class Child : public Parent
{
public:
    int mi;
};
int main()
{
    Child c;
    c.mi = 100; //Whether mi is a subclass custom or is derived from a parent class.
             //mi究竟是子類自定義的,還是從父類繼承得到的
    return 0;
}

2.父子間的衝突

子類可以定義父類中的同名成員
子類中的成員將隱藏父類中的同名成員
父類中的同名成員依然存在於子類中
通過作用域分辨符(::)訪問父類中的同名成員
訪問父類中的同名成員
在這裡插入圖片描述

47-2 同名成員變數深度分析

#include<iostream>
#include<string>
using namespace std;
class Parent
{
public:
    int mi;
    Parent()
    {
	cout << "Parent() :" << "&mi = " << &mi<< endl;
    }
};
class Child : public Parent
{
public:
    int mi;
    Child()
    {
	cout << "Child() :" << "&mi = " << &mi << endl;
    }
};
int main()
{
    Child c;
    c.mi = 100; 
    c.Parent::mi = 1000;
    cout << "&c.mi = " << &c.mi << endl;
    cout << "c.mi = " << c.mi << endl;
    cout << "&c.Parent::mi = " << &c.Parent::mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;
    return 0;
}
執行結果
Parent() :&mi = 0x7ffe2a97d3f0
Child() :&mi = 0x7ffe2a97d3f4
&c.mi = 0x7ffe2a97d3f4
c.mi = 100
&c.Parent::mi = 0x7ffe2a97d3f0
c.Parent::mi = 1000

3.再論過載

類中的成員函式可以進行過載
1.過載函式的本質為多個不同的函式
2.函式名和引數列表是唯一的標識
3.函式過載必須發生在同一個作用域中
4.問題
子類中定義的函式是否能過載父類中的同名函式?

47-3 父子間的函式過載

#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
    int mi;
    void add(int v)
    {
	mi += v;
    }
    void add(int a, int b)
    {
	mi += (a + b);
    }
};
class Child : public Parent
{
public:
int mi;
void add(int v)
    {
	mi += v;
    }
    void add(int a, int b)
    {
	mi += (a + b);
    }
    void add(int x, int y, int z)
    {
	mi += (x + y + z);
    }
};
int main()
{
    Child c;
    c.mi = 100; 
    c.Parent::mi = 1000;
    cout << "c.mi = " << c.mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;
    c.add(1);
    c.add(2,3);
    c.add(4,5,6);
    cout << "c.mi = " << c.mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;
    return 0;
}
執行結果
c.mi = 100
c.Parent::mi = 1000
c.mi = 121
c.Parent::mi = 1000
可以思考下這兩種情況下的執行結果
c.mi = 100
c.Parent::mi = 1000
c.mi = 115
c.Parent::mi = 1006
c.mi = 100
c.Parent::mi = 1000
c.mi = 121
c.Parent::mi = 1000

5.父子間的衝突

子類中的函式將隱藏父類的同名函式
子類無法過載父類中的成員函式
使用作用域分辨符訪問父類中的同名函式
子類可以定義父類中完全相同的成員函式
小結
子類可以定義父類中的同名成員
子類中的成員將隱藏父類中的同名成員
子類和父類中的函式不能構成過載關係
子類可以定義父類中完全相同的成員函式
使用作用域分辨符訪問父類中的同名成員