为什么不能访问基类A在B类初始化列表注册了吗?

   class A
    {
    public:
        explicit A(int a1):a(a1)
        {
        }
        explicit A()
        {
        }

    public:
        int a; 

    public:
        virtual int GetA()
        {
            return a;
        }
    };

    class B : public A
    {
    public:
        explicit B(int a1):a(a1) // wrong!, I have to write a = a1 in {}. or use A(a1)
        {
        }
        int GetA()
        {
            return a+1;
        }
    };

    class C : public A
    {
    public:
        explicit C(int a1):a(a1)
        {
        }
        int GetA()
        {
            return a-1;
        }
    };
有帮助吗?

解决方案

一个的构造之前B的运行,并且,隐式或显式地,前者构建体A的所有实例,包括a构件。因此B无法在a使用构造,因为那场已建成。你试图使用的符号表示确切地使用构造上a,并在这一点上它只是不可能的。

其他提示

要建立在亚历通过控制其结构,像这样的回答,可以初始化基类的的‘一’构件:

class B : public A
{
public:
    explicit B(int a1) : A(a1) { }  // This initializes your inherited "a"
    ...
};

请注意,我构造的基类(大写的 “A”)的上方,而不是试图直接初始化它继承的成员(小写的 “一”下,绘图从你的例子)。

要进一步巩固段落符号的答案,你可以很容易地通过在B级覆盖它初始化是你想要的成员:

class B : public A
{
public:
    int a; // override a

    explicit B(int a1) : a(a1) // works now
    {
    }

    ...
};

虽然,我不一定会推荐这种;)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top