簡體   English   中英

在 C++ 中調用助手 class 的重寫方法

[英]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 的行為。

  1. 復制構造函數不會復制派生的 object,它將被切片並創建基礎 object。

詳細地說,您可以將復制構造函數視為“按值復制”,派生的 object 的每個值都將被復制以創建基本 object。 由於您的 Helper 類沒有 class 成員,因此它沒有復制任何內容。

此外 function 不可復制, C++ 通過vtable處理虛函數。 基礎 class 將具有基礎 class 的 vtable,這就是 hb.something() 稱為基礎版本的原因。

  1. 最后一行是打印 Helper base 因為您的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;
};

class Base中的HelperBase hb始終是HelperBase類型 - 即使您從Child類型的實例調用print也是如此。 有多種方法可以實現您想要的。 一種選擇是使用PIMPL存儲指向Helper class 的指針。 另一種選擇是使用CRTP

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM