Может кто-нибудь объяснить, пожалуйста, множественное наследование ниже, почему конструктор параметризации класса d не вызывается, даже если класс транспортного средства создается с помощью конструктора параметризации.
#include<iostream>
using namespace std;
class d{
public:
d()
{
cout<<"in default constructor of d"<<endl;
}
d(int x)
{
cout<<"in parametrized constructor of d"<<endl;
}
void a()
{
cout<<"a function of d";
}
};
class Vehical:virtual public d
{
public:
Vehical(int x):d(x)
{
cout<<"In paramterized constructor of Vehical" <<endl;
}
void a()
{
cout <<"a function of Vehical class"<<endl;
}
Vehical()
{
cout<<"default constructor of Vehical"<<endl;
}
};
class now: virtual public d
{
public:
void a()
{
cout <<"a function of now "<<endl;
}
now()
{
cout<<"Default constructor of now" <<endl;
}
};
class car :public Vehical, public now
{
public:
car();
car(int y):Vehical(y)
{
};
//using d::a;
using Vehical::a;
};
int main()
{
car ob(1);
ob.a();
return 0;
}
Выход:
in default constructor of d
In paramterized constructor of Vehical
Default constructor of now
Ожидание: он должен был вызвать paremterized конструктор D вместо default, так как мы конструировали транспортное средство, передавая параметр, который действительно вызывает paramterized конструктор класса D.
Также, если мы удалим виртуальный из одного класса, у нас снова будет проблема с бриллиантами? почему так?
Сценарий 1):
Если мы удалим виртуальный из класса транспортного средства, у нас будет следующий вывод
in default constructor of d
in parametrized constructor of d
In paramterized constructor of Vehical
Default constructor of now
a function of Vehical class
Также в выводе выше, почему сначала вызывается конструктор по умолчанию, а затем параметризация класса d? Также в выводе, почему сначала вызывается и конструктор d, а затем транспортное средство и теперь конструктор класса.
Ожидание: он должен был вызвать сначала параметризованный конструктор d, затем параметризовать конструктор транспортного средства, затем конструктор по умолчанию d, а затем конструктор по умолчанию сейчас
Сценарий 2)
А теперь мы удаляем виртуальный класс отныне, и у нас есть вывод, в котором по умолчанию вызывается конструктор d вместо paramterize?
in default constructor of d
In paramterized constructor of Vehical
in default constructor of d
Default constructor of now
a function of Vehical class
Ожидание: для первой строки он должен был вызвать параметризованный конструктор D вместо стандартного.
В Dreaded Diamond of Death есть две проблемы:
1. Определенность базового класса — какой базовый класс должен быть выбран при обращении к этому классу «дедушки».
2. Какой конструктор класса дедушки использует при явном вызове конструкторов базовых классов. Представьте себе следующий пример:
class foo{
public:
foo() { }
foo(int x) { }
};
class bar : virtual public foo
{
public:
using foo::foo;
};
class baz: virtual public foo
{
public:
using foo::foo;
};
class clazz :public bar, public baz
{
public:
clazz(int i) : bar(i), baz(i+1){}
};
Какой конструктор foo
компилятор должен выбрать, так как должен быть создан только один дед? Ну, любой выбор будет означать разрешение конфликта между конфликтующими foo
вызовы конструктора (конфликтуя с другими аргументами). Выбор дизайна языка в C ++ — не пытайтесь разрешить конкуренцию, просто возложите ответственность за инициализацию дедушкиного класса на программистов. Это имеет смысл, потому что наследование алмазов является ключевым случаем, для которого может потребоваться особый способ инициализации.
Вы должны позвонить d
Конструктор явно в конструкторе класса внука:
#include<iostream>
using namespace std;
class d{
public:
d()
{
cout<<"in default constructor of d"<<endl;
}
d(int x)
{
cout<<"in parametrized constructor of d"<<endl;
}
void a()
{
cout<<"a function of d";
}
};
class Vehical:virtual public d
{
public:
Vehical(int x):d(x)
{
cout<<"In paramterized constructor of Vehical" <<endl;
}
void a()
{
cout <<"a function of Vehical class"<<endl;
}
Vehical()
{
cout<<"default constructor of Vehical"<<endl;
}
};
class now: virtual public d
{
public:
void a()
{
cout <<"a function of now "<<endl;
}
now()
{
cout<<"Default constructor of now" <<endl;
}
};
class car :public Vehical, public now
{
public:
car();
car(int y):Vehical(y), d(y)
{
};
//using d::a;
using Vehical::a;
};
int main()
{
car ob(1);
ob.a();
return 0;
}
Других решений пока нет …