【发布时间】:2024-01-20 03:20:01
【问题描述】:
我有以下错误:
IntelliSense:返回类型与被覆盖的虚函数“Counter::operator++”的返回类型“Counter”不同,也不协变
这是我的项目的标题。
counter.h
/* Header file of Counter Class*/
#pragma once
#include <iostream>
using namespace std;
//Class definition
class Counter {
friend ostream &operator<<(ostream &out, const Counter &c);
public:
Counter(int n0 = 0);
virtual Counter &operator++();
virtual Counter operator++(int);
void reset();
int getCount() const;
private:
int count;
};
LimitedCounter.h
#pragma once
#include "counter.h"
class LimitedCounter : public Counter{
friend ostream &operator<<(ostream &out, const LimitedCounter &c);
public:
LimitedCounter(int low, int up);
void reset();
LimitedCounter& operator++();
LimitedCounter operator++(int); // error here
operator int() { return getCount(); };
int getCount() const { return Counter::getCount(); };
private:
int upper;
};
以及实施
counter.cpp
/* Implementation of Counter Class*/
#include "counter.h"
#include <iostream>
Counter:: Counter(int n0) {
count = n0;
}
Counter& Counter::operator++() {
count++;
return *this;
}
Counter Counter::operator++(int) {
Counter old = *this;;
count++;
return old;
}
void Counter::reset(){
count = 0;
}
int Counter::getCount() const{
return count;
}
ostream &operator<<(ostream & out, const Counter &c) {
out << "\nCounter value is now " << c.count ;
return out;
}
LimitedCounter.cpp
#include "LimitedCounter.h"
LimitedCounter::LimitedCounter(int low, int up) : Counter(low), upper(up) {}
LimitedCounter& LimitedCounter::operator++() {
if (getCount() < upper) {
Counter::operator++();
}
return *this;
}
LimitedCounter LimitedCounter::operator++(int) {
if (getCount() < upper) {
LimitedCounter old = *this;
Counter::operator++(0); // question?
return old;
}
else {
return *this;
}
}
void LimitedCounter::reset() {
Counter::reset();
}
//friend function
ostream &operator<<(ostream &out, const LimitedCounter &c) {
out << c.getCount() << endl;
return out;
}
我收到错误:
error C2555: 'LimitedCounter::operator ++': 覆盖虚函数返回类型不同,并且与 'Counter::operator ++' 不协变
当我在 counter.h 的 post-increment 中删除 virtual 时,完全没有错误。因此,预增量一切正常。所以我不知道是不是因为我如何实现后增量?而且当我覆盖后增量( operator++(int) )时,我这样写是否正确:
Counter::operator++(0);
谢谢你帮助我。
【问题讨论】:
-
多态性不能很好地与某些事物混合。如果您在指向
LimitedCounter对象的Counter引用上调用op++,调用者代码如何知道要保留多少空间?Counter对象足够了,还是什么? -
这是一个不真实的实现细节——如果编译器真的想要的话,它可以很容易地透明地间接。真正的问题是它是一个计数器值,因此不能是 LimitedCounter 或任何东西,除了计数器。
标签: c++ inheritance polymorphism operator-overloading virtual