У вашего класса B есть x, а также у A есть X. Таким образом, у вас есть два x в B!Таким образом, вы можете удалить x из вашего класса B?
Если вам нужны оба, вы можете получить к ним доступ с помощью
A :: x или B :: x внутри метода B, который вы уже использовали.did.
Таким образом, у вашего класса D есть и x, и вызов setX вызывает метод setX для A. Как и в D, вы видите x из B, который скрывает ваш x от A, все работает, как и ожидалось.
Ваш метод A :: setX не знал, что вы потом наследуете от него.Если вы хотите переопределить метод, B имеет собственный B :: setX, который затем будет также использоваться в D.
Пример того, как переопределить метод и получить доступ к параметру в производном классе:
class A
{
public:
int x; // A::x
int y = 40; // A::y
// this function only knows about A::x
void setX(int i){ x = i; cout << "setxA" << endl; }
void setY(int i){ y = i; cout << "setyA" << endl; }
};
class B : public A
{
public:
int x =30; // this x ( B::x) hide A::x
int y =50; // this y hides also A::y
// now we override setY from A ( hiding setY from A! )
void setY(int i){ y = i; cout << "setyB" << endl; }
};
class D : public B {
public:
void func() {
setX(10); // Calls A::setX, as A::setX only knows about
// A::x it will access A::x
cout << "X" << std::endl;
cout << x << endl;
cout << B::x << endl;
cout << A::x << endl;
setY(90);
cout << "Y" << std::endl;
cout << y << endl;
cout << B::y << endl;
cout << A::y << endl;
}
};
int main()
{
D d;
d.func();
return 0;
}