继承的方法,我有这样的事情不同类型
class A {
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(B *b) { // do stuff ;};
};
,我想这样做
3210或:A的所有儿童都应该有一个方法doBla,这需要孩子类型的参数。希望你收到我的问题,希望有人能帮助我,或说服我,这是不好的风格:)
编辑:添加虚拟的方法
继承的方法,我有这样的事情不同类型
class A {
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(B *b) { // do stuff ;};
};
,我想这样做
3210或:A的所有儿童都应该有一个方法doBla,这需要孩子类型的参数。希望你收到我的问题,希望有人能帮助我,或说服我,这是不好的风格:)
编辑:添加虚拟的方法
你不能重载整个基地/子类的功能,并doBla
成员函数
class A {
public:
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(A *a) { /*do stuff*/ }
};
编辑:请注意,doBla
函数的声明是在A和B类相似,如果你想从外面把它A
类的必须是public。
是不是会自动公开? – Dirk 2010-08-12 11:05:28
@Dirk:类的成员函数是private(默认),struct的成员函数是public(默认)。 – 2010-08-12 11:11:06
这是不可能的,因为它没有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
};
这样做的问题是你必须知道所有的基类,这并不总是可行或不可行的派生类型。
你需要使A doBla虚拟化。 – 2010-08-12 10:45:47
@尼尔:我不认为这会对这种情况有所帮助。我认为OP需要的是协变参数类型,这在C++中显然目前不受支持(参见http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#C.2B.2B)。 – David 2010-08-12 10:46:56
@尼尔:对不起,忘了那个...... thx – Dirk 2010-08-12 10:47:57