C++ 继承的函数不算作实现吗?
我在一个超类InteractiorStyle中定义了一个函数。然后我有另一个类,它需要实现这个函数(纯虚拟的),PointSelector。然后实例化PointSelector的一个子类PointSelector2D。编译器抱怨我无法实例化抽象类,因为MyFunction()未实现。为什么从InteractorStyle继承的函数不算作此实现C++ 继承的函数不算作实现吗?,c++,C++,我在一个超类InteractiorStyle中定义了一个函数。然后我有另一个类,它需要实现这个函数(纯虚拟的),PointSelector。然后实例化PointSelector的一个子类PointSelector2D。编译器抱怨我无法实例化抽象类,因为MyFunction()未实现。为什么从InteractorStyle继承的函数不算作此实现 #include <iostream> // I can't change these: class InteractorStyle {
#include <iostream>
// I can't change these:
class InteractorStyle
{
void MyFunction(){}
};
class PointSelector
{
virtual void MyFunction() = 0;
};
class PointSelector2D : public InteractorStyle, public PointSelector
{
};
int main()
{
PointSelector2D a;
return 0;
}
#包括
//我不能改变这些:
类交互样式
{
void MyFunction(){}
};
类点选择器
{
虚空MyFunction()=0;
};
类PointSelector2D:PublicInteractorStyle,PublicPointSelector
{
};
int main()
{
点选择器2D a;
返回0;
}
因为通过多重继承,您现在继承了两个不相关的函数,每个基类一个。它们恰好彼此有相同的名称(事实上,它们没有;一个名为interactiorstyle::MyFunction
,另一个名为PointSelector::MyFunction
)
但是其中一个并没有覆盖另一个(至少,不是你希望的那样)。在你展示的代码中,
interactiorstyle::MyFunction
是非虚拟的。因此,它不能覆盖或“实现”任何虚拟功能
但是,即使在那里添加virtual
关键字,interactiorstyle::MyFunction
仍然不能作为派生类PointSelector::MyFunction
中PointSelector2D
的实现
为了用作实现,interactiorstyle::MyFunction
必须在派生自PointSelector
的类中定义。但是如果您只是这样做,让interactiorstyle
从PointSelector
继承,那么在其余代码不变的情况下,它仍然不会在PointSelector或2d
中实现。更糟糕的是,它会引入歧义
为什么??因为PointSelector 2D
然后包含两个PointSelector
基类子对象,一个来自InteractiorStyle
(添加继承的地方),另一个来自其直接继承自PointSelector
因此,如果您需要保留代码,以便interactiorstyle2d
从PointSelector
显式继承,并且希望通过继承引入实现,有点像在Java中,那么
解决方案是认识到PointSelector
实际上是一个接口类,并从中进行虚拟继承,从而确保只有一个基类子对象:
// This class defines an "interface".
class PointSelector
{
public:
virtual void myFunction() = 0;
};
// Derived virtually from the interface
class InteractorStyle
: virtual public PointSelector
{
public:
void myFunction(){}
};
class PointSelector2D
: public virtual PointSelector
, public InteractorStyle
{};
int main()
{
PointSelector2D a; // Ooh, it works! :-)
a.myFunction(); // Yay! No ambiguity!
}
但是查找的模糊性呢?虚拟派生也解决了这一问题,因为它引入了一个特殊的规则,称为支配,其中编译器基本上认识到,由于虚拟派生,PointSelector::myFunction
和interactiorstyle::myFunction
必须相同,前者是声明,而后者在派生类中必须是实现。这有点难以解释清楚,因为我从未找到该标准的相关条款,但至少在C++0x N3290中,您现在可以在索引中找到“支配地位”,参考§10.2/10和§10.2/11中的非规范支配地位示例
<>但是,无论如何,这是如何在C++中实现实现继承的java风格。
Cheers&hth.,这是因为
InteractiorStyle
不是PointSelector
的子类,因此,它的<代码> MyType < /C> >不算作“代码> > PooStor选择器< /Cult>的纯虚代码> MyType < /Cord>。+ 1,它帮助您考虑通过<代码>交互方式和< /COD>访问对象时发生的情况,并通过<代码>点选择器和<代码>:在前一种情况下,调用非虚函数,在后者中,您将调用虚拟机的最派生的实现。