2015-03-21 1 views
1

Почему Down не вызывать Base CTOR через Left & Right дважды?каст множественное наследование неожиданный т е р называется

class Base { 
public: 
    Base() { cout << "base-ctor" << endl; } 
    Base(string a) { cout << a << endl; } 
}; 

class Left : virtual public Base { 
public: 
    Left(string a) : Base(a) {} 
}; 

class Right : virtual public Base { 
public: 
    Right(string a) : Base(a) {} 
}; 

class Down : public Left, public Right { 
public: 
    Down(string a) : Left(a), Right(a) {} 
}; 

int main() { 
    Down x("down"); 
    // -> base-ctor 
} 

ответ

1

Поскольку вы используете виртуального наследования от базового класса:

class Left : virtual public Base { 
class Right : virtual public Base { 

, если вы хотите, чтобы он invoced дважды, удалите виртуальный ключевое слово:

class Left : public Base { 
class Right : public Base { 

Эта статья может быть полезными для вас, если вы хотите избежать «проблемы с алмазами»: http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

0

Зачем это нужно? То, что это не так, буквально целая точка виртуального наследования, которую вы решили использовать в своем примере кода. Думаю, вы решили использовать его, не исследуя, что он делает.

Что касается этого поведения, являющегося «неправильным», то, по определению, ваше ожидание неверно.

 Смежные вопросы

  • Нет связанных вопросов^_^