#include <iostream>
class Base
{
public:
virtual void foo() { std::cout << "Base::foo()\n"; };
};
class Derived : public Base
{
public:
void foo() override
{
std::cout << "Derived::foo()\n";
Base::foo();
}
};
int main()
{
Derived obj;
obj.foo();
return 0;
}
您好,這是我的代碼,我有一個問題,如果我已經在 Derived 類中重新定義它,為什么我可以在 Derived 類中呼叫 Base::foo(),為什么編譯器在重新定義后不洗掉 Derived 類中的 Base::foo?
uj5u.com熱心網友回復:
“為什么編譯器在重新定義后不洗掉類 Derived 中的 Base::foo”
因為那不是什么virtual和override做什么。當您為基類函式提供覆寫時,您不會替換它。您正在為該函式定義一個新版本。基類的實作繼續存在并且可以訪問。
考慮以下代碼。有人仍然可以使用Base物件,并且行為不應該因為Derived存在而改變。的輸出base_obj.foo()應該繼續,而"Base::foo()"不管Derived. :
#include <iostream>
class Base
{
public:
virtual void foo() { std::cout << "Base::foo()\n"; }
};
class Derived : public Base
{
public:
void foo() override { std::cout << "Derived::foo()\n"; }
};
int main()
{
Derived obj;
obj.foo();
Base base_obj;
base_obj.foo();
return 0;
}
還要考慮多個類可以從Base. 我可以添加一個class MyClass : public Base帶有自己版本的foo(),并且它不應該干擾Base物件的Derived行為方式。
如果重寫成員函式會導致基成員函式被完全替換或洗掉,那么如果不仔細閱讀從它派生的每個類,就幾乎不可能對代碼進行推理。除非您的 IDE 為此提供工具,否則它意味著閱讀所有代碼庫。這將使使用多型性的 C 代碼非常難以理解。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/526411.html
標籤:C 多态性虚函数
