在我的子类中,我通过在子类中重新定义它来隐藏超类成员变量或类型,并想知道使用子类隐藏的成员变量的函数调用会发生什么。举个例子:
class A {
class X {
int x;
};
X getX() {
return x_;
}
protected:
X x_;
public:
vector<X> x_vector_;
}
class B : public A {
class x {
int x;
int y;
};
protected:
X x_;
}
当我执行以下操作时会发生什么:
B b;
b.getX();
Q1:这会返回A::x_
还是B::x_
??
怎么样:
B b;
b.x_vector_;
Q2: b.x_vector_是vector<A::X>
还是vector<B::X>
?
答案 0 :(得分:0)
WTF?
// Example translation unit
#include <vector>
using namespace std;
class A {
class X {
int x;
};
getX() {
return x_;
}
X x_;
vector<X> x_vector_;
}
class B : public A {
class x {
int x;
int y;
};
X x_;
}
编译错误示例:
> g++ -Wall -pedantic tmp.cpp
tmp.cpp:10:10: error: ISO C++ forbids declaration of 'getX' with no type [-fpermissive]
tmp.cpp:16:1: error: expected ';' after class definition
tmp.cpp: In member function 'int A::getX()':
tmp.cpp:11:17: error: cannot convert 'A::X' to 'int' in return
tmp.cpp: At global scope:
tmp.cpp:6:11: error: 'class A::X' is private
tmp.cpp:24:5: error: within this context
tmp.cpp:25:1: error: expected ';' after class definition
特别是:error: 'class A::X' is private
。
问:您如何建议子类访问超类中的任何私有(“隐藏”)成员或成员函数?
答案 1 :(得分:0)
我尝试了以下可编辑的代码:
#include <iostream>
using namespace std;
class A {
public:
class X {
public:
X () {
i_ = 1;
}
int getI() {
return i_;
}
protected:
int i_;
};
int getX() {
return xobject_.getI();
}
protected:
X xobject_;
};
class B : public A {
public:
class X : public A::X {
public:
X() {
i_ = 5;
}
int getI() {
return i_;
}
protected:
int i_;
};
protected:
X xobject_;
};
int main (int argc, char** arv) {
B b;
std::cout << "value of b.getX(): " << b.getX() << std::endl;
return 0;
}
输出:
value of b.getX(): 1
这回答了这两个问题。如果我不重新定义子类中的函数getX()
和向量x_vector
,则将使用超类成员。