[英]Calling overridden method of helper class in C++
我來自Python背景,目前我正在C++中學習OOP。
我在弄清楚如何讓代碼在繼承到HelperChild
的助手 class HelperBase
中調用正確方法時遇到問題。
#include <iostream>
class HelperBase {
public:
HelperBase() {}
virtual void something() {
std::cout << "HelperBase" << std::endl;
}
};
class HelperChild : public HelperBase {
public:
HelperChild() {}
void something() {
std::cout << "HelperChild" << std::endl;
}
};
我在 class Base
中使用的HelperBase
class ,它被設置為成員變量。
class Base {
public:
Base(HelperBase &helperBase) : hb(helperBase) {}
virtual void print() {
std::cout << "-- Base" << std::endl;
hb.something();
}
HelperBase hb;
};
然后將此 class 用作 class Child
的基礎 class :
class Child : public Base {
public:
Child(HelperChild &helperChild) : Base(helperChild) {
helperChild.something();
}
};
main
方法是
int main() {
HelperChild helperChild;
Child child(helperChild);
child.print();
return 0;
}
這將輸出以下內容:
HelperChild
-- Base
HelperBase
為什么最后一行沒有打印“HelperChild”? 我必須做哪些改變才能實現這一目標? (我不確定我是否以正確的方式使用了virtual
)。
編輯:在我試圖弄清楚的實際情況下, Base::print
是一個非常大的方法,我不想在Child
class 中覆蓋它。 我只想改變助手 class 的行為。
詳細地說,您可以將復制構造函數視為“按值復制”,派生的 object 的每個值都將被復制以創建基本 object。 由於您的 Helper 類沒有 class 成員,因此它沒有復制任何內容。
此外 function 不可復制, C++ 通過vtable處理虛函數。 基礎 class 將具有基礎 class 的 vtable,這就是 hb.something() 稱為基礎版本的原因。
Base
有一個HelperBase
但沒有派生的HelperChild
。class Base {
public:
Base(HelperBase &helperBase) : hb(helperBase) {} // hp(helperBase) means you still have a helper base.
virtual void print() {
std::cout << "-- Base" << std::endl;
hb.something();
}
HelperBase hb;
};
然后在main
中, child.print()
將調用屬於HelperBase
的 hb.something() 。
要實現多態性,您需要一個指針來獲取HelperChild
的實例。 它被稱為依賴注入,我假設您正在嘗試實現它。
class Base {
public:
Base(HelperBase &helperBase) {
hb = &helperBase;
}
virtual void print() {
std::cout << "-- Base" << std::endl;
hb->something();
}
HelperBase* hb;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.