【发布时间】:2012-09-21 22:19:56
【问题描述】:
例如,我有纯虚函数的基类:
class IBase
{
virtual void Function(const IBase& ref) = 0;
};
如果我继承类,我是否必须重载以派生类为参数的'Function'?
class Derived
{
// this will be implemented
virtual void Function(const IBase& ref) {}
// does this have to be implemented
virtual void Function(const Derived& ref) {}
};
或者编译器可以区分调用,我可以跳过编写重载函数?
Derived d();
...
IBase* dptr = &d; // ignoring cast for example
// would never really call 'Function' on itself, this is for example purposes
dptr->Function(d);
注意:IBase::Function 必须是引用类型,而不是指针类型。
我了解继承纯虚函数的规则,只是不了解这种纯虚函数以基类型作为参数的特殊情况。
我需要知道的是我是否必须在每个继承类型中实现一个将继承类型作为参数的重载,或者编译器是否会理解如果我传递一个 Derived 引用来调用虚拟实现?
【问题讨论】:
-
Derived d();不创建类对象。但它声明了一个名为d的函数,它不带参数并返回Derived类型的对象。它是 之一C++ 中最令人头疼的解析。 -
这只是对默认构造函数的示例调用,因此它在函数的范围内。我明白你的意思,虽然这只是为了证明 Derived 实例的存在。
-
你可以简单地说
Derived d; -
这使得
d未初始化,Derived的默认构造函数可以实例化成员。我建议永远不要让变量未初始化。 -
假设两个函数做同样的事情(并且两种类型都应该是相同的),只有带有
const IBase &参数的那个应该是虚拟的。该函数应该在正确的类型检查后调用另一个函数。也可以使用 CRTP。
标签: c++ inheritance overloading virtual-functions