如何在多重继承中调用超类方法?
How to call superclass method in multiple-inheritance?
我有一个 class C
继承自 Ai
和 B
。 A
和 B
无关。下面的代码对此进行了最好的解释。在 main()
中,我有一个定义为 std::unique_ptr<A>
的变量 a
,但用 C
初始化。我无法更改此定义。
我的问题是,如果 a
是这样定义的,我如何才能正确调用 B
或 C
或 Ai
中定义的函数?
#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_cast
到 C*
:
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 值。
我有一个 class C
继承自 Ai
和 B
。 A
和 B
无关。下面的代码对此进行了最好的解释。在 main()
中,我有一个定义为 std::unique_ptr<A>
的变量 a
,但用 C
初始化。我无法更改此定义。
我的问题是,如果 a
是这样定义的,我如何才能正确调用 B
或 C
或 Ai
中定义的函数?
#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_cast
到 C*
:
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 值。