簡體   English   中英

訪問派生成員而不是派生 class 中具有相同名稱的基成員

[英]Access derived member instead of base member with same name in derived class

假設我有兩個班級

class Base 
{
    private:
    std::vector<int> nums;
public:
    virtual void addNum(int num){
        nums.push_back(num);
    }
 }

class Derived : public Base 
 {
    private:
       std::vector<int> nums;
 }

當我使用派生的 class 並嘗試將數字推入其自己的 nums 向量時,它可能指的是基向量而不是派生向量。

如何在不覆蓋 function addNum 的情況下從父級引用派生的 class 中的 nums 向量

您不能使用成員函數來做到這一點。 但是,您可以使用通用 function (或算法)來做到這一點。 由於您的成員是private ,因此您需要將算法設為好友:

#include <iostream>
#include <vector>

template <typename T> void print(T const&);
template <typename T> void addNum(T&, int);

class Base 
{
    template <typename T> friend void print(T const&);
    template <typename T> friend void addNum(T&, int);

private:
    std::vector<int> nums;
};

class Derived : public Base 
{
    template <typename T> friend void print(T const&);
    template <typename T> friend void addNum(T&, int);
private:
    std::vector<int> nums;
};


template <typename T>
void print(T const& obj) {
    for (auto x: obj.nums) {
        std::cout << x << " ";
    }
    std::cout << "\n";
}

template <typename T>
void addNum(T& obj, int num) {
     obj.nums.push_back(num);
}

int main()
{
    Base b;
    addNum(b, 1);
    addNum(b, 2);
    print(b);

    Derived d;
    addNum(d, 3);
    addNum(d, 4);
    addNum(static_cast<Base&>(d), 5);
    print(static_cast<Base&>(d));
    print(d);
}

我不一定認為這樣的方法是明智的。 但是,這當然是可行的。 類似想法的一個變體是通過virtual function 實際訪問nums容器,產生相應派生 class 的相應版本:

class Base 
{   
private:
    std::vector<int> d_nums;
    virtual std::vector<int> &nums() { return this->d_nums; }
public:
    void addNum(int num) { nums().push_back(num); }
};  

class Derived : public Base 
{   
private:
    std::vector<int> nums;
    std::vector<int> &nums() override { return this->d_nums; }
};  

暫無
暫無

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

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