Выбор конструктора виртуального наследования - PullRequest
0 голосов
/ 26 апреля 2018

Почему эта печать 20000? Код явно вызывает определенные базовые конструкторы вплоть до последовательности наследования, но игнорирует указанный конструктор и использует вместо него конструктор по умолчанию.

#include <iostream>

struct Car
{
  Car() : price(20000) {}
  Car(double b) : price(b*1.1) {}
  double price;
};

struct Toyota : public virtual Car
{
  Toyota(double b) : Car(b) {}
};

struct Prius : public Toyota
{
  Prius(double b) : Toyota(b)  {}
};

int main(int argc, char** argv)
{
  Prius p(30000);

  std::cout << p.price << std::endl;

  return 0;
}

1 Ответ

0 голосов
/ 26 апреля 2018

Виртуальный базовый класс должен быть создан самым производным классом; это единственный способ, который имеет смысл, учитывая возможность ромбовидной иерархии.

В вашем случае Prius создает Car, используя конструктор по умолчанию. Если вам нужен другой конструктор, вам придется вызывать его явно, как в

Prius(double b) : Car(b), Toyota(b) {}
...