我从基类A的对象中放入/获取子类B的值。但是我无法分配或获取值。我的代码是:
class A
{
};
class B: A
{
string SID;
};
class C: A
{
string Name;
};
class D : A
{
string Name;
};
class E
{
A a;
UINT32 AccessLevel;
};
.......
main()
{
E e;
}
使用e的对象试图获取子类B的值。
我需要从B级获得SID吗?
谢谢,
答案 0 :(得分:1)
C ++ 11标准11/3说:
默认情况下,使用关键字class定义的类的成员为
private
。
at 11.2 / 2
如果没有基类的访问说明符,则在使用类 - 键类定义类时假定{...]
private
。
和11.2 / 1:
如果声明一个类是基类 使用
private
访问说明符,基础的public
和protected
成员的另一个类的类 class可以作为派生类的private
成员访问。
那是什么意思?首先:
class A {};
class B : A {};
这里A
凭借11.2 / 2私下继承。如果你想继承变量并且想要仅在派生类中为变量实现getter / setter,这可能没问题,但这通常被认为是不好的样式。
但是,如您所述,正如11/3所述,您的会员根本不是继承人,因为他们是私人会员:
class A
{
public:
int a; // inherited
protected:
int b; // inherited
private:
int c; // NOT inherited
};
特别是
class A { int a; };
相当于
class A { private: int a; };
因此,您可以通过制作public
或protected
(见11.2 / 1),使您的成员可以从 中访问
class A { public: int a; };
class B : A {}; // privately inherits a
如果您希望从派生类的外部中获取它,您还必须继承为public
:
class A { public: int a; };
class B : public A {}; // publicly inherits a
但这不是你通常会做的事情。将变量设为私有并且仅为这些变量设置getter和setter被认为是更好的样式:
class A
{
public:
int get_a() const { return a_; }
void set_a(int val) { a_ = val; }
private:
int a_;
};
class B : public A {}; // now publicly inherits the getters and setters
// but not a_ itself