很长一段时间以来,我已经意识到指针,new
并且delete
在 C++ 中有些不必要,除非处理长期存在的对象,引用是更适合 RAII 模型的更清洁的替代方案。但是,我仍然无法确定在 C++ 中使用动态多态性时如何避免使用指针。
假设我们有这些类:
class A
{
public:
virtual void a() const = 0;
};
class B : public A
{
virtual void a() const
{
std::cout << "B";
}
};
class C : public A
{
virtual void a() const
{
std::cout << "C";
}
};
void invoke(const A& obj)
{
obj.a();
}
int main()
{
B b;
invoke(b); // Prints B
}
对象可以invoke
作为引用传递,并且不涉及指针(嗯,至少从程序员的角度来看)。然而,上面的例子本质上是静态多态。
如果我想让类型b
依赖于其他东西,我将不得不使用指针:
int main()
{
A* a;
if (something)
a = new B;
else
a = new C;
invoke(*a); // Prints B
delete a;
}
这对我来说看起来很丑陋。当然,我可以使用智能指针:
int main()
{
std::unique_ptr<A> a;
if (something)
a.reset(new B);
else
a.reset(new C);
invoke(*a); // Prints B
}
但是智能指针只是指针的包装器。
我想知道是否有办法避免这种情况并在不使用指针的情况下利用多态类。