类层次结构中的约束构造函数,C ++

时间:2016-07-20 07:39:48

标签: c++ class constructor abstract-class subclass

我们说我有两个类,抽象类。

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不是抽象的呢?它改变了什么吗?

2 个答案:

答案 0 :(得分:1)

  

如果A,B不抽象怎么办?它改变了什么吗?

没有。这样做的主要影响是用户可以直接构造A。如果B的构造函数是公共的,那么他们也可以从B对象中实例化A

但是,他们无法从B1实例化B2A。由于它们的构造函数分别采用A1A2作为A的子类,因此无法从AA的错误子类实例化它们

答案 1 :(得分:0)

  

这意味着可以仅使用A1

实例化B1对象

排序。他们必须将A1指针传递给构造函数,但它们不需要A1的实例,因为它们只能传递nullptr

  

而B2必然需要B1对象吗?

没有。 B2需要A2B1不会继承A2

  

这里我没有机会混合,例如使用A2实例化B1。

确实没有机会。 A2*无法转换为A1*

  

这是因为A,B类是摘要。如果A,B不是抽象的呢?

它们是否是抽象的,对B1是否可以使用A2进行实例化没有影响。