导出关于c ++的问题

时间:2009-08-20 04:05:58

标签: c++ derived-class

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

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

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

请注意,我正在构建上面的基类(大写“A”),而不是尝试直接初始化其继承的成员(小写“a”,绘图从你的例子)。

答案 2 :(得分:0)

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

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

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

    ...
};

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