1

为什么我无法访问基类 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;
        }
    };
4

3 回答 3

6

A 的构造函数在 B 之前运行,并且,隐式或显式地,前者构造了 A 的所有实例,包括a成员。因此 B 不能在 上使用构造函数a,因为该字段已经构造。您尝试使用的符号表明要在 上使用构造函数a,而此时这是不可能的。

于 2009-08-20T04:10:14.233 回答
6

要以 Alex 的回答为基础,您可以通过控制其构造来初始化基类的“a”成员,如下所示:

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

请注意,我正在构建上面的基类(大写"A"),而不是尝试直接初始化其继承的成员(小写"a",取自您的示例)。

于 2009-08-20T04:35:35.137 回答
0

为了进一步建立 pilcrow 的答案,您可以通过在 B 类中重写它来轻松地初始化 A 成员:

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

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

    ...
};

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

于 2009-08-20T04:41:26.480 回答