c++ - 如何在多重继承中实现同名虚函数

标签 c++ multiple-inheritance

<分区>

代码如下

// 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 A\n";}
    virtual void B_F() {std::cout << "for B\n";}

};

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 处有一把锁描述为什么它更好。

关于c++ - 如何在多重继承中实现同名虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14754393/

相关文章:

c++ - 使用返回;对于初学者,换个角度看c++

c++ - 功能覆盖在哪里完成?

c++ - 如何在 char[] 中设置二进制数据

C# 多接口(interface)继承不允许具有相同名称的公共(public)访问修饰符

swagger - OpenAPI/JSON Schema 中的多重继承/组合

c++ - 在 Windows C++ 中将字符串的区域设置感知解析为日期

c++ - 错误 : LOWORD undeclared

python - 如果定义一个没有 __init__ 方法的类会怎样?

c++ - Derived1::Base 和 Derived2::Base 是否指代相同的类型?

c++ - 用于多个虚拟继承和类型转换的虚拟表和虚拟指针