Множественное виртуальное наследование и вызов конструктора базового класса - PullRequest
6 голосов
/ 28 января 2012

Имеется этот код:

#include <iostream>

class Bazowa
{
    int x;
public:
    Bazowa() : x(55){}
    Bazowa(int x_) : x(x_) {}
    void fun()
    {
      std::cout << x << "fun\n";
    }
};

class Pochodna1 : virtual public  Bazowa
{
public:
    Pochodna1() : Bazowa(101) {}
};

class Pochodna2 : virtual public  Bazowa
{
public:
    Pochodna2() : Bazowa(103) {}
};

class SuperPochodna : public Pochodna1, public Pochodna2
{
public:
    SuperPochodna() : {}
};


int main() {
    SuperPochodna sp; 
    sp.fun();     // prints 55fun

    return 0;
}

После выполнения этой программы будет напечатано «55fun».Что случилось с вызовами конструктора в классе Pochodna1 и Pochodna2 - они игнорируются?Почему член 'x' класса Bazowa имеет значение '55', а не '101' или '103'?

1 Ответ

9 голосов
/ 28 января 2012

Виртуальные базовые конструкторы всегда вызываются из конечного конечного класса. Ни один из других конструкторов для виртуальной базы не вызывается. В вашем случае SuperPochodna() звонит Bazowa() и вызовы Bazowa(int) в Pochodna1 и Pochodna2 не используются.

См. http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.14 или просто Google "Конструктор виртуальной базы".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...