如何在多重继承中实现具有相同名称的虚拟函数

How to implement virtual functions with the same name in multiple inheritance

本文关键字:函数 虚拟 多重继承 实现      更新时间:2023-10-16

代码如下

// A has a virtual function F().
class A
{
public:
    virtual void F() {};
};
// The same for B.
class B
{
public:
    virtual void F() {};
};
// C inherits A and B.
class C : public A, public B
{
public:
    // How to implement the 2 virtual functions with the same name but from
    // different base classes.
    virtual F() {...}
};

请注意,基类中有一个默认的F()实现。

感谢Jan Herrmann和Spook。如果我们必须使用一些额外的助手,下面的解决方案是否更简单?

#include <iostream>
// A has a virtual function F().
class A
{
private:
    virtual void A_F() {}
public:
    void F() {return A_F();};
};
// The same for B.
class B
{
private:
    virtual void B_F() {}
public:
    void F() {return B_F();};
};
// C inherits A and B.
class C : public A, public B
{
private:
    virtual void A_F() {std::cout << "for An";}
    virtual void B_F() {std::cout << "for Bn";}
};
int main()
{
    C c;
    c.A::F();
    c.B::F();
    return 0;
}
class C_a 
  : public A
{
  virtual void F_A() = 0;
  virtual void F() { this->F_A() };
};
class C_b
  : public B
{
  virtual void F_B() = 0;
  virtual void F() { this->F_B() };
};
class C
  : public C_a
  , public C_b
{
  void F_A() { ... }
  void F_B() { ... }
};

如果我重新组合正确的话,ISO委员会考虑了这个问题,并讨论了语言的改变。但是。。。有人找到了解决这个问题的好方法:-)

如果您能够更改类层次结构,那么第二种解决方案会更好。你可能在http://www.gotw.ca/publications/mill18.htm来描述为什么它更好。

试试这个:

#include <cstdio>
class A
{
public:
    virtual void F() = 0;
};
class B
{
public:
    virtual void F() = 0;
};
class C : public A, public B
{
    void A::F()
    {
        printf("A::F called!n");
    }
    void B::F()
    {
        printf("B::F called!n");
    }
};
int main(int argc, char * argv[])
{
    C c;
    ((A*)(&c))->F();
    ((B*)(&c))->F();
    getchar();
    return 0;
}

不过要考虑的是,您将无法从C的实例调用F(不明确的调用)。

此外,F在A和B中有是抽象的,否则你会得到编译错误:

Error 1 error C3240: 'F' : must be a non-overloaded abstract member function of 'A'