我有两个类,一个扩展另一个。它们都有一个名为 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;
}
}
最佳答案
我能想到的两种方法来实现这一目标。
如果你已经有了多态类型,你的方法就很好(有一些小的改变)。 (如果 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;
}
但是,如果您的类型并不是真正密切相关怎么办?使用继承意味着类之间的关系非常严格(在这种情况下是一种)。 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);
}
关于c++ - 在 C++ 中运行时在用户定义的类之间进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8345265/