在很长一段时间,现在我已经感觉到指针,new并delete用C有点不必要++除非长期对象打交道,与引用是适合在RAII模型更好的清洁替代.但是,在C++中使用动态多态时,我仍然无法确定如何避免指针.
我们有这些clasess:
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
}
Run Code Online (Sandbox Code Playgroud)
对象可以invoke作为引用传递,并且没有涉及指针(好吧,至少从程序员的角度来看).但是,上面的例子基本上是静态多态.
如果我想要b依赖其他东西的类型,我将不得不使用指针:
int main()
{
A* a;
if (something)
a = new B;
else
a = new C;
invoke(*a); // Prints B
delete a;
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这看起来很难看.当然,我可以使用智能指针:
int main()
{
std::unique_ptr<A> a;
if (something)
a.reset(new B);
else
a.reset(new C);
invoke(*a); // Prints B
}
Run Code Online (Sandbox Code Playgroud)
但智能指针只是指针的包装器.
我想知道是否有办法避免这种情况并利用多态类而不使用指针.
你无法避免指出这一点.如果你不喜欢它们,C++不会成为你的语言,因为如果你想做任何多态的事情,你将不得不使用指针来克服最微不足道的用途.在堆上构造对象,即使用new是如何避免堆栈构造对象的作用域生存期,如果要在条件分支内部进行操作然后将它们分配给父作用域中的变量,则必须执行这些操作 - 如果您不这样做我需要这样做,你也不需要多态,因为你的类型都可以在编译时确定.没有办法解决这个问题.
当然,使用智能指针,它们可以真正帮助避免指针生命周期的问题,但无论你最终使用什么样的酷抽象,都会在某处出现指针.