проверка закрытой переменной с использованием объекта производного класса - PullRequest
1 голос
/ 02 марта 2011

ниже - небольшая программа. я хочу проверить значение закрытой переменной x класса A, используя объект класса B. возможно ли это когда-либо?

#include<stdio.h>
#include<conio.h>
#include<iostream>

class A {
    int x;
public:
    A() {
        x=10;
    }
};

class B : public A { 
public:
    int x;
};

int main()
{
    B obj;
    obj.x=20;
    std::cout<< obj.x;
    getch();
}

Это выдаст 20, но как я могу проверить значение x как 10, которое находится в class A? я хотел знать, можем ли мы проверить значение, не делая x защищенным!

Ответы [ 7 ]

2 голосов
/ 02 марта 2011

Вам нужно будет сделать переменную защищенной или вы можете создать метод защищенного члена в классе A, который возвращает переменную x.

Используя второй подход (защищенный метод члена или свойство (isчто возможно в C ++?), класс B может читать переменную, но не может ее изменить.

1 голос
/ 02 марта 2011

В дополнение к закрытой / защищенной проблеме ваш B::x участник закрашивает x из A. Так что, даже если бы оба были публичными, вам нужно было бы написать b.A::x. Выглядит странно, но работает (см. Код ниже) ....

Это синтаксически. Вы должны сделать это, конечно, как все здесь говорят. использовать защищенные члены со значимыми именами и функции доступа

class A {
public:
  int x;
};

class B: public A {
public:
  int x;
  void f() { std::cout << "B::x=" << x << ", A::x=" << A::x << '\n'; }
};

int main()
{
  B b;
  b.A::x = 10;
  b.x = 20;
  b.f();
}

выход:

B::x=20, A::x=10
1 голос
/ 02 марта 2011

Производные классы не могут видеть рядовых предков. Вы можете использовать «защищенный» для потомков, чтобы увидеть данные, но не связанные классы.

0 голосов
/ 02 марта 2011

Ну, если вы действительно хотите знать, возможно ли это: так и есть. public, protected и private являются только проверками времени компиляции. Один из возможных вариантов их обхода во время выполнения:

#include <iostream>
class A{
    int x;
    A() : x(10){}
};
struct pubA{
    int x;
};

int main(){
    A a;
    // evil casting
    pubA* pa = reinterpret_cast<A*>(&a);
    std::cout << pa->x << std::endl; // should print 10
}

Тем не менее, не делай этого . Есть причина для этих ключевых слов. (Приведенный выше код не проверен, потому что я пишу с моего iPod. Если reinterpret_cast не работает, используйте старое приведение в стиле C: pa = (pubA*)&a.)

0 голосов
/ 02 марта 2011

Вы не должны.

Поскольку ваш A класс сообщает, что член является личным, никто, кроме A, не может получить к нему доступ.

Если B is-an- A, действует то же правило: A::x по-прежнему недоступно.

Если вы хотите получить к нему доступ, вам нужен либо другой тип A (т.е. сделать A::x общедоступным), либо вы хотите не ту вещь.

0 голосов
/ 02 марта 2011

Сделать x в A защищенным и написать метод в B, который выглядит примерно так:

int getAX(){
  return A::x
}
0 голосов
/ 02 марта 2011

Нельзя проверять ценность приватных членов базового класса.Итак: добавьте метод доступа в A или сделайте A :: x защищенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...