c++ - 为什么这个类是抽象的?

标签 c++ class abstract-class abstract virtual-functions

我正在尝试创建表示多项式的 LinkedList 的实现。链接列表将是“术语”的列表。术语是 Data 的实现(它是具有方法的抽象类:compareTo() 和 toString())。 Polynomial 类有一个名为 head 的变量,我试图将其初始化为 Term。我的编译器说我“不能声明抽象类型的成员:Term”,但我不认为 Term 是抽象的,因为它是 Data(抽象类)的实现。如果你们能看看这个并让我知道我遗漏的任何巨大危险信号,我将不胜感激。 集合.h:

  class Data {
  public:
  virtual ~Data() {}

virtual int compareTo(Data * other) const = 0;

virtual string toString() const = 0;
};

class Term : public Data { 
public:
int coefficient;
string variable1;
int exponentX;
string variable2;
int exponentY;
Term * next;

Term(int coeff, string var1, int exp1, string var2, int exp2, Term * next) : 
    coefficient(coeff), 
    variable1(var1),
    exponentX(exp1),
    variable2(var2),
    exponentY(exp2),
    next(next) {};

string convertInt(int number) {
    stringstream ss;//create a stringstream
    ss << number;//add number to the stream
    return ss.str();//return a string with the contents of the stream
}

int compareTo(Term * term) {
    if(this->exponentX > term->exponentX) {
    return 1;
    }
    else if(this->exponentX < term->exponentX) {
    return -1;
    }
    else {
        if(this->exponentY > term->exponentY) {
        return 1;
        }
        else if(this->exponentY < term->exponentY) {
        return - 1;
        }
        else {
        return 0;
        }
    }
}
string toString() {
    stringstream s;
    int * current = &this->coefficient;
    if(*current == 1 || *current == -1) {
    }
    else if(coefficient != 0) {
    s << convertInt(coefficient);
    }
    else { return s.str(); }
    if(variable1 != "" && this->exponentX != 0) {
    s << variable1;
    s << convertInt(exponentX);
    }
    if(variable2 != "" && this->exponentY != 0) {
    s << variable2;
    s << convertInt(exponentY);
    }
return s.str();
}   
};

此外,这里是 LinkedList 的实现。那里还有一些其他方法,但它们似乎没有给出任何问题。

链表.cpp:

 class Polynomial : public LinkedList { 
public:
Term head;

Polynomial() {
this->head = NULL;
}

~Polynomial() {
Term * current = head;
    while (current != NULL) {
        Term * next = current->next;
        delete current;
        current = next;
    }
}

谢谢!

最佳答案

当您覆盖虚拟方法时,您必须精确地匹配函数签名。返回类型可能会根据协变规则而有所不同,但参数类型必须完全相同。

在基类Data函数中compareTo声明为

virtual int compareTo(Data * other) const

在派生类Term中声明为

int compareTo(Term * term)

首先,参数类型不同。其次,缺少 const

这意味着你在派生类中写了一个完全不相关的函数。它不会覆盖基类的纯虚函数。由于基础纯虚函数保持未覆盖,类 Term 仍然是抽象的。

Term 中,您必须准确声明您的函数

int compareTo(Data * other) const

我假设您希望在 Term 中使用 compareTo 仅用于 Term-to-Term 比较。但在此设计中,您必须将 Data 作为参数接收,然后将其转换为 Term,或者使用双重调度技术。

附言最重要的是,您将 Term 对象声明为您的 Polynomial 类的成员 head ,然后将其用作 指针

Term * current = head;

这完全没有意义。如果您希望您的 head 是一个指针,请将其声明为一个指针。如果你想让它成为一个对象,那么就停止将它用作指针。要么这样要么那样。

关于c++ - 为什么这个类是抽象的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11496204/

相关文章:

c++ - 使用 Qt 检查键是否已关闭

c++ - 在 C++ 中使用重新解释转换来扩展嵌套宏

c++ - SDL2 释放空指针

java - 私有(private)实例变量/类定义

python - 在 ABC 的不同具体实现之间实例化对象选择

python - SWIG C++/Python:如何处理抽象类的shared_ptr的std::map

c++ - 抽象类总是拥有一个虚表吗?

c++ - 具有非静态成员函数的 std::function

java - 增强for循环中的类方法

java - 类和迭代器接口(interface)之间的关系