继承的函数不算作实现吗?
Does an inherited function not count as an implementation?
我在超类InteractorStyle中定义了一个函数。然后我有另一个类,需要实现该函数(纯虚拟),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;
}
因为使用多重继承,您现在继承了两个不相关的函数,一个来自每个基类。他们只是碰巧彼此有相同的名字(事实上,他们没有;一个称为InteractorStyle::MyFunction
,另一个称为PointSelector::MyFunction
)。
但是其中一个不覆盖另一个(至少,不是在您希望的意义上)。
在您呈现的代码中,InteractorStyle::MyFunction
是非虚拟的。因此,它不能覆盖或"实现"任何虚函数。
但是,即使您在那里添加了virtual
关键字,InteractorStyle::MyFunction
仍然不会在您的派生类PointSelector2D
中作为PointSelector::MyFunction
的实现。
为了作为实现,InteractorStyle::MyFunction
必须定义在从PointSelector
派生的类中。但是,如果您只是这样做,让InteractorStyle
继承PointSelector
,那么在其余代码不变的情况下,仍然不可能是PointSelector2D
中的实现。更糟的是,它会带来歧义!
为什么?因为PointSelector2D
随后包含两个PointSelector
基类子对象,一个来自InteractorStyle
(您添加了继承),另一个来自PointSelector
的直接继承。
所以,如果你需要保持InteractorStyle2D
显式继承PointSelector
的代码,和你想通过继承来实现,就像在Java中一样,那么& help;
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
和InteractorStyle::myFunction
必须是相同的,并且前者是声明,而后者在派生类中必须是实现。这有点难以解释清楚,因为我从来没有找到关于它的标准条款,但至少在c++ 0x N3290中,您现在找到了"主导地位"。在索引中,参考§10.2/10和§10.2/11中的非规范性支配性例子。
但是,无论如何,这就是如何在c++中实现java风格的继承。
干杯,hth。
- 在命名空间内部还是外部实现 c++ 函数?
- 如何在C++中实现函数(f)(x)(y, z)(g)(r)
- 如何在C++中实现函数上的二叉搜索?
- 键按下事件错误 Qt 实现函数时
- 在子类之外实现函数导致未知错误
- 通过模板滥用实现函数式C++
- C++,实现函数"int next(std::string param)"时出现奇怪的编译器错误
- 我正在尝试创建自己的 strcat() 函数,而不是使用库实现函数<cstring>
- 如果未实现函数,则在链接时启用错误
- 用函数参数实现c++函数指针
- 如何在Android SDK中调用和实现C++函数
- 在 C++ RCPP 中实现 R 函数
- 实现函数模板填充多维对象
- 类的层次结构,试图在基本级别实现函数
- 用c++实现函数对象的自动检测类型
- 用shared_ptrs实现函数模板的C++实例化
- 在类中实现函数导致错误:成员引用基类型'ifstream (string)'不是结构或联合
- 用c++实现S函数.生成错误
- 引用可以用于实现函数重写吗
- 如何在c++中实现函数超时