2016-07-20 2 views
1

Предположим, у меня есть два класса, абстрактные классы.Ограниченный конструктор в иерархии классов, C++

class A { 
//code... 
}; 
class B { 
public: 
    B(A *x); 
}; 

И я расширяю оба класса следующим образом:

class A1 : public A { 
}; 
class A2 : public A { 
}; 

class B1 : public B { 
public: 
    B1(A1 *x); 
}; 
class B2 : public B { 
    B2(A2 *x); 
}; 

Это означает, что B1 объект может быть реализован с использованием только A1, в то время как B2 обязательно нужно право на B1 объект? Нет никакого шанса, что я мог бы смешивать вещи, используя A2 для экземпляра B1, например. Это связано с тем, что классы A,B являются абстрактными. А если A,B не являются абстрактными? это что-то меняет?

+3

'B2' нужен указатель на' A2'. – Bathsheba

+0

Вы можете сделать свой ctor с помощью параметра 'A *' в качестве параметра, тогда вы можете использовать 'A1' или' A2' для их создания. – songyuanyao

+1

Что именно заставляет вас подозревать, что B1 может быть создан с помощью A2? Почему с A2, а не с Foo, Bar, int (int) или std :: string? –

ответ

1

А если A, B не являются абстрактными? это что-то меняет?

№. Основное воздействие этого заключается в том, что пользователь может напрямую построить A. Если конструктор B является общедоступным, он также сможет создать экземпляр B с этого объекта A.

Однако они не смогут создать экземпляр B1 или B2 с этого A. Поскольку их конструкторы принимают A1 и A2 соответственно, которые являются подклассами A, их невозможно создать из A или из неправильного подкласса A.

0

Это означает, что объект В1 может быть реализован с использованием только A1

сортировки. Они должны передать указатель A1 на конструктор, но им не нужен экземпляр A1, потому что они могут просто передать nullptr.

В то время как B2 обязательно нужен объект B1?

No. B2 нуждается в A2 и B1 не наследует A2.

Здесь нет никаких шансов, что я мог бы смешивать вещи, используя A2 для экземпляра B1, например.

На самом деле нет никакой возможности. A2* не конвертируется в A1*.

Это потому, что классы A, B являются абстрактными. Как насчет того, если A, B не являются абстрактными?

Независимо от того, являются ли они абстрактными, не влияет на то, может ли B1 создать экземпляр с помощью A2.

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

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