У меня возникли проблемы с множественным наследованием и проблемой с алмазом.Вам нужно вызвать конструктор виртуального базового класса из всех производных классов? Даже если они не самые производные?
Проблема возникает из-за того, что для моего базового класса требуется параметр. Компилятор пытается создать конструктор по умолчанию для моих двух абстрактных классов, но это не удается, потому что конструктор по умолчанию не может определить параметр для базового класса.
Я не понимаю, почему мои абстрактные классы называют базовый конструктор. Я думал, что наиболее производным классом является тот, который вызывает конструктор виртуального базового класса.
Вот код, который воспроизводит то, что я говорю:
class VirtualBase
{
public:
VirtualBase(int initial) :
count(initial)
{}
int getCount() const
{
return count;
}
void increment()
{
count++;
}
private:
int count;
};
class ContractA : public virtual VirtualBase
{
public:
virtual void doSomething() = 0;
};
class ContractB : public virtual VirtualBase
{
public:
virtual void doSomethingElse() = 0;
};
class Concrete : public ContractA, public ContractB
{
public:
Concrete() :
VirtualBase(0)
{}
virtual void doSomething()
{
increment();
}
virtual void doSomethingElse()
{
// etc...
}
};
int main()
{
Concrete concrete;
concrete.doSomething();
concrete.doSomethingElse();
return 0;
}
Я получаю следующее сообщение об ошибке (для каждого контракта):
main.cpp: In constructor ‘ContractA::ContractA()’:
main.cpp:29:7: error: no matching function for call to ‘VirtualBase::VirtualBase()’
class ContractA : public virtual VirtualBase
^
main.cpp:29:7: note: candidates are:
main.cpp:9:3: note: VirtualBase::VirtualBase(int)
VirtualBase(int initial) :
^
main.cpp:9:3: note: candidate expects 1 argument, 0 provided
main.cpp:4:7: note: VirtualBase::VirtualBase(const VirtualBase&)
class VirtualBase
^
main.cpp:4:7: note: candidate expects 1 argument, 0 provided
main.cpp: In constructor ‘Concrete::Concrete()’:
main.cpp:53:17: note: synthesized method ‘ContractA::ContractA()’ first required here
VirtualBase(0)
^
Это очень плохо. В моем случае я просто дал базовому классу параметр по умолчанию. Это хорошо работает для меня здесь, потому что большинство объектов будут иметь одинаковый параметр в любом случае. Затем я могу перегрузить параметр, если это необходимо. Не очень, но маршрут «манекен-конструктор» имеет каскадный эффект, который требует от меня написать много бесполезного кода. – user2445507
@ user2445507: Возможно, вы можете использовать «недопустимое» значение по умолчанию, а 'assert' - это не такое значение. –