長い間、私はポインターを認識しており、長寿命のオブジェクトを扱う場合を除き、C++ ではやや不必要であり、参照は RAII モデルにより適したよりクリーンな代替手段ですnew
。delete
ただし、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
}
しかし、スマート ポインターはポインターの単なるラッパーです。
これを回避し、ポインターを使用せずにポリモーフィック クラスを利用する方法があるかどうかを知りたいです。