【问题标题】:Automatically implement virtual functions depending on sister classes根据姊妹类自动实现虚函数
【发布时间】:2013-03-21 03:22:48
【问题描述】:

有没有我可以用来帮助实现依赖于基类存在的虚函数的习语?例如,我有

class B {/* some abstract interface. */};

class A
{
public:
  virtual B* getB() {return nullptr;}
};

class C : public A, public B
{
public:
  B* getB() override {return this;}

  /* Implement B's interface here.*/
};

而且我通常想像这样实现getB - 我可以以某种方式避免对所有叶类重复此操作吗?我可能有一些接口类,比如 B,

我知道做到这一点的一种方法是在 C 和 B 中都从 A 虚拟继承,但如果可能的话,我希望 B 与 A 无关。

【问题讨论】:

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


    【解决方案1】:

    您可以在 A 中完成所有操作:

    class A
    {
    public:
        virtual B* getB() {return dynamic_cast<B*>(this);}
    };
    

    注意:这里的virtual 只是为了使A 类具有多态性,这是使用dynamic_cast 的要求。我们不打算覆盖getB()

    【讨论】:

    • 这是“使用dynamic_cast的必要条件?还是要覆盖子类中的函数?
    • C++11 5.2.7 动态转换表示“否则,v 应是指向多态类型的指针或左值”。这是“否则”的情况之一。源类型必须是多态的,才能进行向下和交叉转换。
    • getB() 本身不需要是虚的,如果 A 有其他虚函数。
    • 谢谢,但是 5.2.7/5 不涵盖这种情况(而不是您引用的 /6)?
    • 没有。该段涵盖了向上转换。