具有非 void 返回类型的虚函数
virtual functions with a non-void return type
考虑以下继承和组合方案。
示例程序
#include <iostream>
#include <valarray>
using namespace std;
class TapProcessing
{
public:
TapProcessing(){};
virtual ~TapProcessing(){};
virtual void getWeights(valarray<double> &weights) {};
virtual void getPrecisionWeights (valarray<double> &precWeights) {};
virtual const uint &getTapIndex(const uint index) const
{
valarray<uint> a;
a.resize(10);
return a[index];
}; //const {return 0;};
virtual const uint &getTapIndexLow(const uint index) const
{
valarray<uint> a;
a.resize(10);
return a[index];
}; //const {return 0;};;
virtual const uint &getTapIndexHigh(const uint index) const
{
valarray<uint> a;
a.resize(10);
return a[index];
}; //const {return 0;};
};
class StepPrecisionTapProcessing : public TapProcessing
{
public:
StepPrecisionTapProcessing() { _tapIndex.resize(10, 3); }
~StepPrecisionTapProcessing() {};
void getWeights(valarray<double> &weights) { return weights.resize(10);}
virtual const uint &getTapIndex(const uint index) const {return _tapIndex[index]; }
private:
valarray<uint> _tapIndex;
};
class HighPrecisionTapProcessing : public TapProcessing
{
public:
HighPrecisionTapProcessing()
{
_tapIndexLow.resize(10, 4);
_tapIndexHigh.resize(10, 5);
}
~HighPrecisionTapProcessing() {};
void getPrecisionWeights (valarray<double> &precWeights) { return precWeights.resize(10); };
virtual const uint &getTapIndexLow(const uint index) const {return _tapIndexLow[index]; }
virtual const uint &getTapIndeHigh(const uint index) const {return _tapIndexHigh[index]; }
private:
valarray<uint> _tapIndexLow;
valarray<uint> _tapIndexHigh;
};
class Generator
{
public:
Generator(bool isPrecision)
{
if (isPrecision) {_tp = new HighPrecisionTapProcessing();
}
else { _tp = new StepPrecisionTapProcessing(); }
}
~Generator() { delete _tp; }
const uint &getTapIndex(const uint index) const {return _tp->getTapIndex(index); }
const uint &getTapIndexLow(const uint index) const {return _tp->getTapIndexLow(index); }
const uint &getTapIndexHigh(const uint index) const {return _tp->getTapIndexHigh(index); }
private:
TapProcessing *_tp;
};
int main()
{
Generator *G = new Generator(true);
uint index = 5;
cout<<"High tap index is = "<<G->getTapIndexHigh(index)<<endl;
delete G;
return 0;
}
当我运行main时,我得到以下输出,
高抽头指数为 = 0
在这里,如果派生类中 getTapIndeHigh 的声明覆盖了基类中的声明,我们将在输出中看到值 5 而不是 0。为什么派生类实现不覆盖非空虚方法的类方法的基数?
问题来自这些行...
virtual uint getTapIndex(uint index) {};
virtual uint getTapIndexLow(uint index) {};
virtual uint getTapIndexHigh(uint index) {};
它们描述了一个返回uint
的函数,提供了一个实现,但实际上并不返回一个值。
如果有合理的基础实现,那么最好提供它。 但是在这里,您似乎想要一个pure virtual
方法,使您的类abstract
。 您希望所有派生类都实现一个值。 例如
virtual uint getTapIndex(uint index) =0; // require derived classes to implement
virtual uint getTapIndexLow(uint index) { return 0 } // can be overridden, but defaults to returning zero.
virtual uint getTapIndexHigh(uint index) = 0; // require derived classes to implement.
相关文章:
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 在 c++ 中将函数返回类型指定为模板参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 如何避免模板函数返回类型重复?
- 从类型bankAccount的返回值到函数返回类型int没有可行的转换
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- 模板类内模板类的函数返回类型
- 为什么函数返回类型中不允许参数推导?
- 函数返回类型之前的"define"
- C++推断要隐式调用的模板函数返回类型
- 具有不同模板参数的函数返回类型
- 当函数返回类型为父类时,如何返回子类的对象?
- C++:在原型中声明"auto"函数返回类型仍然会导致在扣除错误之前使用"auto&quo
- C++14 'auto'能够获取函数返回类型,我们还需要 std::result_of<> 吗?
- 函数返回类型中的模板类型推断
- 嵌套模板类返回类型在 C++ 中的头文件中函数返回类型的语法
- C++重写 void 函数返回类型会导致生成失败
- 从函数内部推断函数返回类型
- C++嵌套类函数返回类型和命名空间