我有类似的东西
class A {
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(B *b) { // do stuff ;};
};
我希望做类似
的事情A* a = new B();
B* b = new B();
a->doBla(b);
或:A的所有孩子都应该有一个方法doBla,它接受一个孩子类型的参数。希望你能解决我的问题,并希望有人可以帮助我或说服我这是不好的风格:)
编辑:将虚拟添加到方法
答案 0 :(得分:1)
您不能在基类/子类之间重载函数,如果您想从外部调用它,doBla
类A
的成员函数必须是公共的:
class A {
public:
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(A *a) { /*do stuff*/ }
};
编辑:请注意,doBla
函数的声明在A和B类中类似。
答案 1 :(得分:1)
这是不可能的 - 因为它没有doBla(B * b)函数,所以当你试图在一个实例上调用它时,编译器不能以任何方式保证该函数实际存在,并且它不知道如何查找。这是一个错误或十个。
您可能正在寻找的是双重发送。
class A {
public:
virtual void doBla(A* a) { a->doBla_impl(this); }
private:
virtual void doBla_impl(A* a);
virtual void doBla_impl(B* b);
// etc
};
class B : public A {
public:
virtual void doBla(A* a) { a->doBla_impl(this); }
private:
virtual void doBla_impl(A* a);
virtual void doBla_impl(B* b);
// etc
};
这样做的麻烦在于你必须知道基类中的所有派生类型,这并不总是可行或可行。