我将这些 C++ 类定义如下:
class A
{
public:
B *createB();
};
class B
{
public:
virtual void fun() = 0;
};
class B1 : B {/* ... */};
class B2 : B {/* ... */};
所以基本上 B 是一个抽象类,B1 和 B2 是 B 的具体实现,A 在其代码的某处创建了一个 B 类型的实例。重要的是要注意A 不是工厂,A::createB
只是一个例子。
我希望能够在 A 的初始化期间传递 B 的子类,因此可以在运行时根据需要由后者创建前者的实例。例子:
A *a1 = /* sorcery here */;
A *a2 = /* another magic code */;
a1->createB(); // getting B1
a2->createB(); // getting B2
实现它的最佳方法是什么?不使用模板可以吗?
根据回复,我最终得到了这个。谢谢!
class B
{
public:
virtual void fun() = 0;
virtual B *clone() = 0;
};
class B1 : public B
{
public:
virtual void fun()
{
std::cout << "B1" << std::endl;
}
virtual B *clone()
{
return new B1();
}
};
class B2 : public B {/* analogous to B1 */};
class A
{
public:
A(B *b) : b(b) {};
B *createB()
{
return b->clone();
}
private:
B *b;
};
A(new B1()).createB()->fun(); // prints "B1"
A(new B2()).createB()->fun(); // prints "B2"