2015-09-25 1 views
0

Я использую множественное наследование, а один базовый класс (BaseBNeedsA) нуждается в доступе к другому базовому классу (BaseA). Я знаю, что это можно было бы решить с помощью делегирования, но на самом деле было бы очень много кода пересылки, и у меня есть несколько подобных классов, таких как BaseBNeedsA.C++: Почему это компилируется? (Передача этой ссылки на базовый класс)

В Visual Studio 2013 я мог бы использовать BaseA & для доступа, в Visual Studio 2015 это, похоже, приводит к нарезке объектов или чему-то еще. (Компилирует, но ссылки недействительны). Поэтому я изменил его на BaseA * const, и все работает. Однако, делая это, я нашел что-то странное. Код ниже компилируется в Visual Studio 2015, и я не могу понять, почему он должен.

class BaseA 
{ }; 


class BaseBNeedsA 
{ 

public: 

    BaseBNeedsA(BaseA *baseA) 
    : _baseA(baseA) 
    { } 


private: 

    BaseA * const _baseA; 

}; 


class Derived : public BaseA, public BaseBNeedsA 
{ 

public: 

    Derived() 
    : BaseA(), 
    BaseBNeedsA(*this) // Why does this compile? Handing a BaseA&, but BaseA* required! 
    { } 

}; 


int main(int argc, char** argv) 
{ 
    Derived d; 
    return 0; 
} 
+2

он называет копировальный конструктор 'BaseBNeedsA' –

+1

@PiotrSkotnicki Это не комментарий! – Yakk

+0

Как я пропустил это. Сделайте это ответом, чтобы я мог принять его. – B3ret

ответ

1

Класс BaseBNeedsA имеет неявно определенную копию-конструктор:

BaseBNeedsA(const BaseBNeedsA&); 

, которая определена с помощью вызова:

BaseBNeedsA(*this) 

, потому что *this в классе Derived может быть связан ссылкой на BaseBNeedsA.

+0

Спасибо, полностью пропустил. Я добавлю C++ 11 удаленных реализаций по умолчанию во всех базах, чтобы получить ошибки компилятора для этой неприятной ошибки. – B3ret