C++中的多重继承与虚函数
Multiple inheritance in c++ with virtual functions
我有这个代码:
class A
{
public:
virtual void FA()=0;
};
class B: public A
{
public:
virtual void FB()=0;
};
class Imp_A: public A
{
public:
void FA()
{
// implement FA
}
};
class Imp_B :public Imp_A, public B
{
public:
void FB()
{
// implement FB by calling FA()
FA();
// do some more work here.
}
};
在 class Imp_B 中,我不想实现 FA,因为它已经在 Imp_A 中实现了,class 是基于它的。
但是当我尝试编译我的代码时,出现错误 Imp_B 是虚拟的,无法实例化。
同样,当我尝试在 FB 中调用 FA 时,我收到 FA 不明确的错误。
我该如何解决这个问题?
请注意 Imp_A 基于 A 并实现它,Imp_B 基于 Imp_A 和 B,其想法是它使用 [=29] 的 A 实现=] 并且只实现 B。
class B: public A
{
public:
virtual FB()=0;
}
您忘记将其显式声明为 void
,因此声明:
virtual int FB()=0;
并在 Imp_B
中声明:
void FB();
那当然不行。你没有覆盖任何东西。
这看起来像 classic "diamond inheritance problem",其中您在基础 class 中定义了一个虚拟方法,它被两个或多个其他 classes 继承用作多重继承的来源。
无论如何 - 虚拟继承是您问题的答案
class A
{
public:
virtual void FA()=0;
}
class B: virtual public A
{
public:
virtual void FB()=0; //probably a pure virtual function as well!?
}
class Imp_A: virtual public A
{
public:
void FA()
{
// implement FA
}
}
class Imp_B :public Imp_A, public B //since you call FA() you need it's implementation from Imp_A
{
public:
void FB()
{
// implement FB by calling FA()
FA();
// do some more work here.
}
}
这里的问题是 Imp_b 最终来自两个 class A 定义的 FA 定义;使用虚拟继承有助于解决这个问题。
您的继承shema大致是:
Imp_B
/ \
Imp_A B
| |
A A
这意味着您继承自 A 的两个不同实现。因此 Imp_A::FA
确实已定义,但 B::A
未定义,因此 class Imp_B
仍然是抽象的.它还解释了 FA 不明确的错误,因为它可能是 Imp_A::FA
或 B::A
。
解决方法:
- 您可以删除继承
class B: public A
。这样 A
和 FA
将只存在于一个分支中,并且所有将被定义
你可以将基础 class A
设为虚拟,这意味着 Imp_B
:
中只会存在一个实例
class B: virtual public A
...
class Imp_A: virtual public A
...
我有这个代码:
class A
{
public:
virtual void FA()=0;
};
class B: public A
{
public:
virtual void FB()=0;
};
class Imp_A: public A
{
public:
void FA()
{
// implement FA
}
};
class Imp_B :public Imp_A, public B
{
public:
void FB()
{
// implement FB by calling FA()
FA();
// do some more work here.
}
};
在 class Imp_B 中,我不想实现 FA,因为它已经在 Imp_A 中实现了,class 是基于它的。
但是当我尝试编译我的代码时,出现错误 Imp_B 是虚拟的,无法实例化。
同样,当我尝试在 FB 中调用 FA 时,我收到 FA 不明确的错误。
我该如何解决这个问题?
请注意 Imp_A 基于 A 并实现它,Imp_B 基于 Imp_A 和 B,其想法是它使用 [=29] 的 A 实现=] 并且只实现 B。
class B: public A
{
public:
virtual FB()=0;
}
您忘记将其显式声明为 void
,因此声明:
virtual int FB()=0;
并在 Imp_B
中声明:
void FB();
那当然不行。你没有覆盖任何东西。
这看起来像 classic "diamond inheritance problem",其中您在基础 class 中定义了一个虚拟方法,它被两个或多个其他 classes 继承用作多重继承的来源。
无论如何 - 虚拟继承是您问题的答案
class A
{
public:
virtual void FA()=0;
}
class B: virtual public A
{
public:
virtual void FB()=0; //probably a pure virtual function as well!?
}
class Imp_A: virtual public A
{
public:
void FA()
{
// implement FA
}
}
class Imp_B :public Imp_A, public B //since you call FA() you need it's implementation from Imp_A
{
public:
void FB()
{
// implement FB by calling FA()
FA();
// do some more work here.
}
}
这里的问题是 Imp_b 最终来自两个 class A 定义的 FA 定义;使用虚拟继承有助于解决这个问题。
您的继承shema大致是:
Imp_B
/ \
Imp_A B
| |
A A
这意味着您继承自 A 的两个不同实现。因此 Imp_A::FA
确实已定义,但 B::A
未定义,因此 class Imp_B
仍然是抽象的.它还解释了 FA 不明确的错误,因为它可能是 Imp_A::FA
或 B::A
。
解决方法:
- 您可以删除继承
class B: public A
。这样A
和FA
将只存在于一个分支中,并且所有将被定义 你可以将基础 class
中只会存在一个实例A
设为虚拟,这意味着Imp_B
:class B: virtual public A ... class Imp_A: virtual public A ...