Вы должны сделать что-то вроде этого:
GridLayout gridLayout = new GridLayout(this);
gridLayout.setColumnCount(2);
gridLayout.setRowCount(4);
Поскольку это позволяет избежать этого:
class A {
public:
A(int) {}
};
class B0: virtual public A {
public:
B0(): A(0) {}
};
class B1: virtual public A {
public:
B1(): A(1) {}
};
class C: public B0, public B1 {
public:
C() {} // How is A constructed? A(0) from B0 or A(1) from B1?
};
Поскольку в иерархии классов, имеющей фактически унаследованный базовый класс, базовый класс будет / может делиться несколькими классами (например, в наследовании алмаза, где один и тот же базовый класс наследуется несколькими классами). Это означает, что будет только одна копия фактически унаследованного базового класса. По сути, это означает, что базовый класс должен быть построен первым. В конечном итоге это означает, что производный класс должен создать экземпляр заданного базового класса.
Например:
class A;
class B1 : virtual A;
class B2 : virtual A;
class C: B1,B2 // A is shared, and would have one copy only.
Я нахожу это правило ошибочным и громоздким (но тогда какая часть множественного наследования отсутствует?).
Но логически наложенный порядок построения должен отличаться от случая нормального (не- -виртуальное) наследование. Рассмотрим пример Ajay, минус virtual:
class A;
class B1 : A;
class B2 : A;
class C: B1,B2
В этом случае для каждого C два As построены, один из них является частью конструкции B1, а другой - частью конструкции B2. Код класса B отвечает за это и может это сделать. Порядок событий:
Start C ctor
Start B1 ctor
A ctor (in B's ctor code)
End B1 ctor
Start B2 ctor
A ctor (in B's ctor code)
End B2 ctor
End C ctor
Теперь рассмотрим виртуальное наследование в
class A;
class B1 : virtual A;
class B2 : virtual A;
class C: B1,B2
. Один порядок события -
Start C ctor
Start B1 ctor
// NO A ctor
End B1 ctor
Start B2 ctor
// NO A ctor
End B2 ctor
A ctor // not B's code!
End C ctor
Возможно, что A строится до B1 и B2, но это не имеет значения. Важно то, что конструкция А не происходит при построении других базовых классов. Этот код просто не выполняется и не может быть выполнен, потому что фактически унаследованный под-объект базового класса типа A является частью и под управлением самого производного класса , который недоступен из B1 и Код B2; действительно, C даже не полностью сконструирован в момент времени B1 или B2, и он может потенциально попытаться создать A в C.
B0
илиB1
? – Oktalist 2 June 2017 в 14:37