繁体   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