访问派生成员,而不是派生类中具有相同名称的基成员



假设我有两个类

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;
}

当我使用派生类并试图将数字推送到它自己的nums向量中时它可能指的是基向量,而不是导出的向量。

如何在不重写函数addNum 的情况下从父类引用派生类中的nums矢量

使用成员函数不能做到这一点。但是,可以使用泛型函数(或算法(来执行此操作。由于您的成员是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函数实际访问nums容器,生成相应派生类的相应版本:

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; }
};  

最新更新