关于多继承和定义虚函数

时间:2011-05-06 12:51:36

标签: c++ multiple-inheritance virtual-functions

我有一个没有虚拟基类的多继承场景,如下所示:

 Ta  Tb
 |   |
 B   C
  \ /
   A

Ta和Tb是两个不同的模板类,它们都声明一个名为f()的虚函数。我想覆盖A范围中的两个函数,因为我必须在这些方法中与B和C数据进行交互。但我不知道该怎么做。

class Tb {
protected:
    virtual void f() {};
public:
    void call() {
        this->f();
    };  
};

class Tc {
protected:
    virtual void f() {};
public:
    void call() {
        this->f();
    };
};

class B : public Tb {
public:
    void doSomething() {};
};

class C : public Tc {
private:
    int c;
public:
    void inc() { c++; };
};

class A : public B, public C {
protected:
    void f() { // this is legal but I don't want to override both with the same definition.
        // code here
    }
    // if Tb::f() is called then i want to call C::inc()
    // if Tc::f() is called then i want to call B::doSomething()
public:
    void call() {
        B::call();
        C::call();
    };
};

是否有语法覆盖具有不同定义的方法,或者我必须在B和C中定义这些方法吗?

由于

编辑: 我的问题不是无法调用Tb :: f()或Tc :: f(),而是我想在调用Tb :: f()或Tc :: f()时定义两种不同的行为。这些方法由Tb和Tc本身在其自己的公共方法中调用。 修改了这个例子,所以也许更清楚我想做什么......

3 个答案:

答案 0 :(得分:7)

  

是否有语法覆盖具有不同定义的方法,或者我必须在B和C中定义这些方法吗?

简答:不。

您的A:f()会覆盖Ta::f()Tb::f()

如果你想要不同的覆盖,唯一的解决方案是插入辅助类Hb和Hc:

Ta  Tb
|   |
B   C
|   |
Hb  Hc
 \ /
  A 

Hb可以小到两个函数,只是为了重命名函数:

class Hb: public B {
   protected: // overrides from Ta
     virtual void f() { Ta_f(); }

   protected: // new virtuals
     virtual void Ta_f() = 0;
 };

然后你可以定义A::Ta_f()来做你想做的事情(包括调用B::f()!)

答案 1 :(得分:3)

您确实在课程A中覆盖了这两项内容。如果不这样做,除非使用using指令明确指定您喜欢的方法,否则会出现歧义。

您可以在BC类中单独覆盖这些方法,但同样,一旦A类继承,您必须决定应该使用哪一种。

答案 2 :(得分:3)

您是否必须能够将A替换为TbTc?如果没有,您是否考虑过使用A中的组合而不是继承?

如果您需要以这种方式替换,您是否考虑过简单的方法并且只是调用父方法两个不同的名称?由于你想要单独覆盖它们,所以指示它们没有做同样的事情。