如何在成员变量中分配和检索值?

时间:2013-10-08 10:53:35

标签: c++ visual-c++ inheritance

我从基类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吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

C ++ 11标准11/3说:

  

默认情况下,使用关键字class定义的类的成员为private

at 11.2 / 2

  

如果没有基类的访问说明符,则在使用类 - 键类定义类时假定{...] private

和11.2 / 1:

  

如果声明一个类是基类   使用private访问说明符,基础的publicprotected成员的另一个类的类   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; };

因此,您可以通过制作publicprotected(见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