Прямо сейчас, я изучаю функции Inheritance на C++ и хочу проверить недавно изученную концепцию виртуальных базовых классов. Я попробовал следующий простой код:Почему стандартная инициализация в C++ 11 ведет себя странно с виртуальными базовыми классами?
#include <iostream>
using namespace std;
class A
{
private:
int m_value;
string m_caller;
public:
A(int p_value, string p_caller) : m_value{p_value}, m_caller{p_caller}
{
cout<<"Instantiating A via "<<m_caller<<endl;
}
};
class B : virtual public A
{
private:
int m_value;
public:
B(int p_value1,int p_value2) : A{p_value1,"B"}, m_value{p_value2}
{
cout<<"Instantiating B."<<endl;
}
};
class C : public B
{
public:
C(int p_value1,int p_value2) : A{p_value1,"C"}, B(p_value1, p_value2)
{
cout<<"Instantiating C."<<endl;
}
};
int main()
{
C c1(1,2);
return 0;
}
Пожалуйста, обратите внимание B(p_value1, p_value2)
в конструкторе класса C. Это дало мне желаемый результат:
Instantiating A via C
Instantiating B.
Instantiating C.
Но, в тот момент я изменил его B{p_value1, p_value2}
, Я получил следующий вывод:
Instantiating A via C
Instantiating A via B
Instantiating B.
Instantiating C.
Я пытался искать ответ, но все ответы, которые я получил процитировал некоторые стандарты C++ , Будучи новичком в ООП, я ищу более простое объяснение этого поведения. Спасибо большое!
P.S. Я использую C :: B в Windows с компилятором g ++ 4.8.1.
Fyi, clang ++ 3.7 не показывает поведение, которое вы описываете. Обе версии выдают один и тот же результат (первый). – WhozCraig
Вы вызываете конструктор копирования во втором случае. – lorro
@UpAndAdam Самый производный класс отвечает за инициализацию виртуальных базовых классов, код не будет компилироваться, если OP не вызвал конструктор 'A' напрямую. И что это такое в * передаче в преобразованных строковых литералах, как будто они являются ints *? – Praetorian