Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承的函数不算作实现吗?_C++ - Fatal编程技术网

C++ 继承的函数不算作实现吗?

C++ 继承的函数不算作实现吗?,c++,C++,我在一个超类InteractiorStyle中定义了一个函数。然后我有另一个类,它需要实现这个函数(纯虚拟的),PointSelector。然后实例化PointSelector的一个子类PointSelector2D。编译器抱怨我无法实例化抽象类,因为MyFunction()未实现。为什么从InteractorStyle继承的函数不算作此实现 #include <iostream> // I can't change these: class InteractorStyle {

我在一个超类InteractiorStyle中定义了一个函数。然后我有另一个类,它需要实现这个函数(纯虚拟的),PointSelector。然后实例化PointSelector的一个子类PointSelector2D。编译器抱怨我无法实例化抽象类,因为MyFunction()未实现。为什么从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>访问对象时发生的情况,并通过<代码>点选择器和<代码>:在前一种情况下,调用非虚函数,在后者中,您将调用虚拟机的最派生的实现。