2010-08-12 115 views
1

继承的方法,我有这样的事情不同类型

class A { 
    virtual void doBla(A *a) = 0; 
}; 

class B : public A { 
    virtual void doBla(B *b) { // do stuff ;}; 
}; 

,我想这样做

​​3210

或:A的所有儿童都应该有一个方法doBla,这需要孩子类型的参数。希望你收到我的问题,希望有人能帮助我,或说服我,这是不好的风格:)

编辑:添加虚拟的方法

+0

你需要使A doBla虚拟化。 – 2010-08-12 10:45:47

+0

@尼尔:我不认为这会对这种情况有所帮助。我认为OP需要的是协变参数类型,这在C++中显然目前不受支持(参见http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#C.2B.2B)。 – David 2010-08-12 10:46:56

+0

@尼尔:对不起,忘了那个...... thx – Dirk 2010-08-12 10:47:57

回答

1

你不能重载整个基地/子类的功能,并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。

+0

是不是会自动公开? – Dirk 2010-08-12 11:05:28

+0

@Dirk:类的成员函数是private(默认),struct的成员函数是public(默认)。 – 2010-08-12 11:11:06

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 
}; 

这样做的问题是你必须知道所有的基类,这并不总是可行或不可行的派生类型。