Конструкторы при виртуальном наследовании
От: Barbar1an Украина  
Дата: 28.06.18 14:25
Оценка:
class A
{
    public:
        A(int a){}
};

class B : public virtual A
{
    public:
        B(int a) : A(a) {}
};

class C : public B
{
    public:
        C(int a) : B(a) {} //  error C2512: 'A::A': no appropriate default constructor available
};

C c;


ну и нафига ему нужен этот дефолтный конструктор?
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Конструкторы при виртуальном наследовании
От: reversecode google
Дата: 28.06.18 14:35
Оценка:
вбейте в гугл — прочитайте результат
https://software.intel.com/en-us/forums/intel-c-compiler/topic/277305 и по ссылкам
в чем сложность ?
Re: Конструкторы при виртуальном наследовании
От: Анатолий Широков СССР  
Дата: 28.06.18 14:37
Оценка: 1 (1)
Здравствуйте, Barbar1an, Вы писали:


B>ну и нафига ему нужен этот дефолтный конструктор?


Можно встречный вопрос? Выведет ли эта программа ok?

class A
{
    public:
        int a;
        A(int a) : a(a) {}
}; 

class B : public virtual A
{
    public:
        B(int a) : A(a) {}
};

class C : public B
{
    public:
        C(int a) : A(10), B(a) {} 
};

int main() {
    C c(20);
    if( c.a == 10 ) {
       cout << "ok";
    }
    return 0;
}
Re[2]: Конструкторы при виртуальном наследовании
От: Barbar1an Украина  
Дата: 28.06.18 14:44
Оценка: :)
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Здравствуйте, Barbar1an, Вы писали:



B>>ну и нафига ему нужен этот дефолтный конструктор?


АШ>Можно встречный вопрос? Выведет ли эта программа ok?


не выведет, но зачем мне инициализировать А если его B уже инициализровал?
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[3]: Конструкторы при виртуальном наследовании
От: Barbar1an Украина  
Дата: 28.06.18 14:49
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>не выведет, но зачем мне инициализировать А если его B уже инициализровал?


в смысле выведет) но почему конструткор B не используется? и когда он используется?
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[4]: Конструкторы при виртуальном наследовании
От: Анатолий Широков СССР  
Дата: 28.06.18 15:13
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>Здравствуйте, Barbar1an, Вы писали:


B>>не выведет, но зачем мне инициализировать А если его B уже инициализровал?


B>в смысле выведет) но почему конструткор B не используется? и когда он используется?


Потому что B виртуально наследует А, а это означает, что цепочка конструирования будет такая: сначала A, потом B и B будет использовать уже инициализированный объект A, потом C (читай 15.6.2 Initializing bases and members). А это так, для иллюстрации выдержка из стандарта:

Отредактировано 28.06.2018 15:15 Анатолий Широков . Предыдущая версия . Еще …
Отредактировано 28.06.2018 15:13 Анатолий Широков . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.