我有两个类,一个扩展另一个。他们都有一个名为doSomething()
的方法,可以执行不同的操作。我希望能够有一个指针,我可以从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;
}
}
答案 0 :(得分:5)
我可以想到两种方法来实现这一目标。
如果你已经有多态类型,你的方式很好(有一些小的改动)。 (如果B
是一个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)。 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);
}
答案 1 :(得分:2)
您要实现的目标称为多态性。在C ++中,您需要为A和B定义一个公共(可能是抽象的)基类C,使doSomething为virtual function,在A和B中都覆盖它,并生成类型为C *的指针。这是关于该主题的good introductory article。