В моем подклассе я скрываю переменную или тип члена суперкласса, переопределяя ее в моем подклассе и задаваясь вопросом, что происходит с вызовами функций, которые используют переменные-члены, скрытые подклассом. В качестве примера:
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>
??
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
,
Вопрос: Как именно вы предлагаете подклассу доступ к любым закрытым («скрытым») членам или функциям-членам суперкласса?
Я попробовал следующий скомпилированный кусок кода:
#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
в подклассе будут использоваться члены суперкласса.