背景
我一直在閱讀有關繼承和弄亂一些代碼的內容,并且試圖更好地理解如何實作虛函式,更廣泛地說,如何更改派生類中的成員變數。這是我到目前為止所得到的:
代碼
#include <iostream>
class Base
{
private:
int m_value {};
public:
Base(int value = 5): m_value {value}
{
}
int getValue()
{
return m_value;
}
virtual void add(int addend)
{
m_value = m_value addend;
}
};
class Derived: public Base
{
private:
int m_value {};
public:
Derived(int value = 5): m_value {value}
{
}
virtual void add(int addend)
{
m_value = m_value addend;
}
};
int main()
{
Derived derived {};
std::cout << derived.getValue() << "\n";
derived.add(2);
std::cout << derived.getValue() << "\n";
return 0;
}
問題
add()我希望繼承的類在呼叫時更改其成員變數。具體來說,我期望derived.add(2)等于derived.m_value7 而不是 5。但是,盡管我努力了,但我無法derived.m_value改變。
我試過的
我查看了一篇提出類似問題的帖子(繼承類的成員函式不會更改繼承的基類變數),因此我添加了一個像這樣的多載賦值運算子:
class Derived: public Base
{
private:
int m_value {};
public:
Derived(int value = 5): m_value {value}
{
}
Derived& operator=(const Derived& derived)
{
m_value = derived.m_value;
return *this;
}
void add(int addend)
{
m_value = m_value addend;
}
};
但是,我嘗試過的這個添加和其他一些變體仍然不起作用。似乎我不明白繼承的成員函式如何與其成員變數互動,就像我想的那樣。
uj5u.com熱心網友回復:
請在您的示例下方找到您想要的作業方式。我會在代碼下面解釋。
#include <iostream>
class Base
{
protected: // HERE change n°1
int m_value;
public:
Base(int value = 5) : m_value{ value }
{
}
int getValue()
{
return m_value;
}
virtual void add(int addend)
{
m_value = m_value addend;
}
};
class Derived : public Base
{// HERE change n°2 : no more Derived::m_value which shadows the Base::m_value (this is due to the members of same name)
public:
Derived(int value = 5) : Base{ value } // HERE change n°3 : we build the parent class by calling it's constructor so Base::m_value is initialized
{
}
void add(int addend) noexcept override // HERE change n°4
{
m_value = m_value addend;
}
};
int main()
{
Derived derived{};
std::cout << derived.getValue() << "\n";
derived.add(2);
std::cout << derived.getValue() << "\n";
return 0;
}
更改 n°1:通過將成員 m_value 的可見性設定為受保護,這意味著我們現在可以在子類中訪問它。從 OOP 的角度來看,這就是您想要在類之間擁有共同的模式/行為和東西的東西。如果您在父類中將其設定為私有,則您將無法在子類中訪問它。該宣告對成員和方法有效。例如,您可能想隱藏一些由父類執行的內部管理。
更改 n°2 :洗掉子類中 m_value 的宣告,因為它會影響 Olaf 解釋的 Base::m_value。
更改 n°3:最后,我們在子類建構式的 init 串列中呼叫基類的建構式,因此當您在 main 中宣告派生變數時,基類實體構造良好。
更改 n°4:您可以將覆寫關鍵字添加到您繼承的虛擬方法中。這是對編譯器的提示,因此它會檢查方法簽名是否與父類中的方法簽名相同。這樣,如果您撰寫了錯誤的方法簽名,或者您在父類中更改了方法,您將收到錯誤/警告。
希望能幫助到你
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/487140.html
