使用派生类对象检查私有变量

时间:2011-03-02 10:31:24

标签: c++ inheritance

下面是小程序。 我想使用类B的对象检查类A的私有变量x的值。 有可能吗?

#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,但如何检查xclass A的值为10? 我想知道我们是否可以在不将x视为受保护的情况下检查值!

7 个答案:

答案 0 :(得分:2)

您必须使变量受保护,或者,您可以在A类中创建一个返回变量x的受保护成员方法。

通过使用第二种方法(受保护的成员方法或属性(可能在C ++中?),B类可以读取变量,但不能更改它。

答案 1 :(得分:1)

派生类无法看到祖先的私人。您可以为后代使用“protected”来查看数据,但不能查看不相关的类。

答案 2 :(得分:1)

除私人/受保护问题外,您的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

答案 3 :(得分:0)

您无法检查基类的私有成员的值。所以:在A中添加一个访问器或使A :: x受保护。

答案 4 :(得分:0)

将A中的x保护为受保护并在B中编写一个看起来像这样的方法:

int getAX(){
  return A::x
}

答案 5 :(得分:0)

你不应该。

由于您的A班级告知该会员是私人会员,因此A除了B之外的任何人都无法访问该会员。

如果A是 - { - 1}},则相同的规则有效:A::x仍无法访问。

您想要访问它意味着您需要另外一种A(即公开A::x),或者您想要错误的事情。

答案 6 :(得分:0)

好吧,如果你真的想知道它是否可能:它是。 publicprotectedprivate只是编译时检查。在运行时期间绕过它们的一种可能选择是:

#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。)