不同类型的继承方法

时间:2010-08-12 10:40:43

标签: c++ oop

我有类似的东西

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,它接受一个孩子类型的参数。希望你能解决我的问题,并希望有人可以帮助我或说服我这是不好的风格:)

编辑:将虚拟添加到方法

2 个答案:

答案 0 :(得分:1)

您不能在基类/子类之间重载函数,如果您想从外部调用它,doBlaA的成员函数必须是公共的:

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

这样做的麻烦在于你必须知道基类中的所有派生类型,这并不总是可行或可行。