C ++の実行時にユーザー定義クラスを変更する
-
27-10-2019 - |
質問
1つがもう1つを拡張する2つのクラスがあります。どちらも呼ばれる方法を持っています doSomething()
それは何か違うことを実行します。切り替えることができるポインターを1つ持っていることができるようになりたい class A
に class B
コードの残りの部分を同じように実行させます。それぞれが同じメソッド名を持っているためです。これは可能ですか、これはそれを行うための正しい方法ですか?また、私はC ++をかなり初めてなので、それはそれで単なる問題になる可能性があります。
class A {
void doSomething()
{
// does something
}
};
class B: public A {
void doSomething()
{
//does something else
}
};
main()
{
A *ptr = new A;
B *bptr = new B;
// a giant loop
ptr->doSomething();
if(condition)
{
ptr = bptr;
}
}
他のヒント
これを達成するために私が考えることができる2つの方法。
あなたがすでに多型タイプを持っている場合、あなたの方法は(いくつかの小さな変更がある)問題です)。 (もしも B
is-an A
, 、論理的に)
class A
{
public:
virtual void f() { /* something */ };
};
class B : public A
{
public:
virtual void f() { /* something else */ };
};
int main()
{
A a;
B b;
A* c = 0;
// based on your condition
c = &a;
c->f();
c = &b;
c->f();
return 0;
}
しかし、あなたのタイプが実際にそれほど密接に関連していない場合はどうなりますか?継承を使用することは、クラス間の非常に剛性のある(IS-A、この場合)関係を意味します。 aです B
本当に A
?
同じ名前の関数を持つクラスでこれを達成する方法は次のとおりですが、実際には似たようなタイプではありません。
template <class T>
void do_f(T& obj)
{
obj.f();
}
class D
{
public:
void f() { /* something */ }
};
class E
{
public:
void f() { /* something else entirely */ }
};
int main()
{
// note, D and E have no relation
D d;
E e;
// based on your condition
do_f(d);
do_f(e);
}
所属していません StackOverflow