[英]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.