关于this question我看到所有的答案是使用指针的基类(Base *baseObject
),然后使用new
关键字来实例化基类的不同的实现。
比方说,如果有一个Base
类是这样的:
class Base
{
public:
int Id;
}
和其它类是这样的:
class A : public Base {...}
class B : public Base {...}
反正是有实例化一个基类对象有条件但不使用的指针,这样的:
Base a;
if (...) a = new A();
else if (...) a = new B()
编辑:
基于评论没有任何力量使用new
关键字。
您可以使用引用,而不是指针。
例如:
Derived d;
Base &b = d;
问题是,使用值,而不是指针时,你总是得到相同类型的值。因此,对于这种情况下:
Base b;
变量b
不能是什么,但b
的一个实例。即使你这样做:
Derived d;
Base b = d; // d is sliced into b
变量d
和b
是不同的实例。要做到assignement,编译器必须d
的值转换为类型Base
的值,就像这样:
double d = 9.5;
int i = d; // i is 9, it sliced the .5
所以,你必须有一些参考,或某种变量,允许不同类型。
这通常是多态是如何完成的。你让b
引用类型,可以参考扩展Base
对象的任何实例。
std::unique_ptr<Base> b = std::make_unique<Derived>();
这将创建类型Derived
的唯一指针,并将其分配给类型Base
的唯一指针。 b
现在指向一个Derived
对象的实例。
相反,如果你想使用的参考,你必须有一个活着的停留足够的时间来使用它,像一个变量:
void foo(Base& refToBase);
void bar() {
Derived d;
foo(d);
} // d is guaranteed to die here.
变体是一类可具有多种类型的值。它只能包含一个值,所以类型之间是“变化”。
例如:
std::variant<int, std::string> v;
v = 12;
v = "text";
所以,你可以用它来创建一个变量,可以派生类型有所不同:
std::variant<A, B> a_or_b;
if(...) {
a_or_b = A{};
} else {
a_or_b = B{};
}
std::visit(
[](Base& b) { /* do stuff with the base */ },
a_or_b
);
我不认为如此。
new
指针返回到一新创建的对象的关键字。这就是为什么你需要一个基类指针(或特定的一个)来存储它。Base a;
。它已经创建了Base类的对象。所以你想一个指针从派生类分配给新的对象,以你的基类的不同,已存在的对象。只需使用一个指针,一切都很好:
Base* a;
if (...) a = new A();
else if (...) a = new B();
反正是有实例化一个基类对象有条件但没有使用指针
当然:
if(condition) {
A a;
} else {
B b;
}