我们说我有两个类,抽象类。
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
不是抽象的呢?它改变了什么吗?
答案 0 :(得分:1)
如果A,B不抽象怎么办?它改变了什么吗?
没有。这样做的主要影响是用户可以直接构造A
。如果B
的构造函数是公共的,那么他们也可以从B
对象中实例化A
。
但是,他们无法从B1
实例化B2
或A
。由于它们的构造函数分别采用A1
和A2
作为A
的子类,因此无法从A
或A
的错误子类实例化它们
答案 1 :(得分:0)
这意味着可以仅使用A1
实例化B1对象
排序。他们必须将A1
指针传递给构造函数,但它们不需要A1
的实例,因为它们只能传递nullptr
。
而B2必然需要B1对象吗?
没有。 B2
需要A2
而B1
不会继承A2
。
这里我没有机会混合,例如使用A2实例化B1。
确实没有机会。 A2*
无法转换为A1*
。
这是因为A,B类是摘要。如果A,B不是抽象的呢?
它们是否是抽象的,对B1
是否可以使用A2
进行实例化没有影响。