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