вывести проблему с C ++ - PullRequest
       9

вывести проблему с C ++

1 голос
/ 20 августа 2009

Почему я не могу получить доступ к базовому классу А, являющемуся членом списка инициализации класса В?

   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 ]

6 голосов
/ 20 августа 2009

Чтобы построить ответ Алекса, вы можете инициализировать элемент базового класса ' "a" , управляя его конструкцией, например:

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

Обратите внимание, что я создаю базовый класс (заглавная "A" ) выше, а не пытаюсь напрямую инициализировать его унаследованный член (строчные "a" , опираясь на пример). * * +1010

6 голосов
/ 20 августа 2009

Конструктор A запускается перед B, и, неявно или явно, первый конструирует все экземпляры A, включая член a. Поэтому B не может использовать конструктор на a, потому что это поле уже построено. Обозначение, которое вы пытаетесь использовать, точно указывает на использование конструктора на a, и в этот момент это просто невозможно.

0 голосов
/ 20 августа 2009

Чтобы еще больше развить ответ Pilcrow, вы можете легко инициализировать элемент A так, как вам хочется, переопределив его в своем классе B:

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

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

    ...
};

Хотя я бы не рекомендовал это;)

...