下面是小程序。 我想使用类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
,但如何检查x
中class A
的值为10?
我想知道我们是否可以在不将x视为受保护的情况下检查值!
答案 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)
好吧,如果你真的想知道它是否可能:它是。 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
。)