Пожалуйста, прочтите код, чтобы понять ситуацию.
#include <iostream>
using namespace std;
class one
{
protected:
int x;
public:
one(int a)
{
x=a;
cout << "one cons called\n";
}
void display(void)
{
cout << "x = " << x << endl;
}
~one()
{
cout << "one destroy\n";
}
};
class two : virtual protected one
{
protected:
int y;
public:
two(int a,int b) : one(a),y(b)
{
cout << "two cons called\n";
}
void display(void)
{
one::display();
cout << "y = " << y << endl;
}
~two()
{
cout << "two destroy\n";
}
};
class three : protected virtual one
{
protected:
int z;
public:
three(int a,int b) : one(a),z(b)
{
cout << "Three cons called\n";
}
void display(void)
{
one::display();
cout << "z = " << z << endl;
}
~three()
{
cout << "three destroy\n";
}
};
class four : private two, private three
{
public:
four(int a,int b,int c) :one(a), two(a,b),three(a,c)
{
cout << " four cons called\n";
}
void display(void)
{
one::display();
cout << "y = " << y << endl;
cout << "z = " << z << endl;
}
~four()
{
cout << "four destroy\n";
}
};
int main()
{
four ob(1,2,3);
ob.display();
return 0;
}
Если я заменю код
four(int a,int b,int c) :one(a), two(a,b),three(a,c)
с
four(int a,int b,int c) :two(a,b),three(a,c)
сообщение об ошибке типа: в моем кодовом блоке ide не найдено подходящей функции для вызова 'one :: one()'.
Как вы можете видеть, это код, основанный на проблеме алмазов. Где первый класс - класс grand_parent. Второй и третий класс служат родительским классом, а четвертый - дочерним. Поэтому я использовал виртуальное ключевое слово, чтобы избежать двусмысленности. Все, что я здесь понимаю, кроме 1 вещи. Я знаю, что когда родительский класс имеет параметризованный конструктор, мы должны предоставить аргументы этому конструктору из производного класса. Итак, почему же нужно указывать аргумент в конструкторе первый, где у класса четыре есть только 2 родительских класса, то есть два и три. Код выдаст мне ошибку времени компиляции, если я не вызову конструктор один из четвертого класса. Пожалуйста, объясните мне, почему мы должны это сделать.