如何在多重继承中调用超类方法?

How to call superclass method in multiple-inheritance?

我有一个 class C 继承自 AiBAB 无关。下面的代码对此进行了最好的解释。在 main() 中,我有一个定义为 std::unique_ptr<A> 的变量 a,但用 C 初始化。我无法更改此定义。

我的问题是,如果 a 是这样定义的,我如何才能正确调用 BCAi 中定义的函数?

#include <memory>

class A 
{ 
public: 
  void fun_a() {}
}; 
  
class B 
{ 
public: 
  void fun_b() {}
}; 

class Ai : public A
{ 
public:
    void fun_ai() {}
}; 
  
class C: public Ai, public B
{ 
public:
    void fun_c() {}
}; 
  
int main() 
{ 
    // I cannot change the following definition:
    std::unique_ptr<A> a = std::make_unique<C>();
    
    a->fun_a();
    //a->fun_b(); // How ?
    //a->fun_c(); // How ?
    //a->fun_ai(); // How ?
    
    return 0; 
}

您可以 static_castC*:

static_cast<C*>(a.get())->fun_b();
static_cast<C*>(a.get())->fun_c();
static_cast<C*>(a.get())->fun_ai();

或者你可以让它多态:

class A { 
public: 
    virtual ~A() = default;
    void fun_a() { std::cout << "fun_a\n"; }
};

然后 dynamic_cast:

dynamic_cast<B*>(a.get())->fun_b();
dynamic_cast<C*>(a.get())->fun_c();
dynamic_cast<Ai*>(a.get())->fun_ai();

注意:dynamic_cast指向指针类型可能会失败,return nullptr 因此,如果有任何疑问,请检查 return 值。

Demo