【问题标题】:Why can't I acces the virtual function through an object call? [duplicate]为什么我不能通过对象调用访问虚函数? [复制]
【发布时间】:2021-07-04 17:31:41
【问题描述】:

我正在尝试做一个使用银行卡的OOP模拟,只是为了练习,没什么太复杂的;我收到一个奇怪的错误。这个调用有点傻,但我只是想看看“读取”功能是否正常,而不是测试它的真正目的。我不明白为什么会出现以下错误,我知道我可以直接使用对象访问虚拟方法,而不必使用指针。另外,很抱歉大多数成员不是用英语写的。这是我的代码:

#include <iostream>
#include <string>
using namespace std;

class Card
{

protected:
    string nrCard;
    string NumeDetinator;
    string data_expirare;
    int CVV;
    double credit;

    static unsigned nr_ord;

public:
    Card();
    Card(string nC, string ND, string d_ex, int cvv, double CRD);
    virtual getCredit(); //= 0;
    virtual void print(ostream&) const;//= 0;
    virtual void read(istream&) ;//= 0;
    virtual void print(ostream &) ;//= 0;
};

unsigned Card :: nr_ord = 0;

Card :: Card() : nrCard("XXXX - XXXX - XXXX - XXXX"), NumeDetinator("???? ????"), data_expirare("DD - MM - YY"), CVV(999), credit(0.0) {}
Card :: Card(string nC, string ND, string d_ex, int cvv, double CRD) : nrCard(nC), NumeDetinator(ND), data_expirare(d_ex), CVV(cvv), credit(CRD) {}

void Card::print(ostream& out) const {
    out << "numar card: " << this->nrCard << "\n";
    out << "Nume detinator: " << this->NumeDetinator << "\n";
    out << "data expirare: " << this->data_expirare << "\n";
    out << "CVV " << this->CVV << "\n";
    out << "Credit disponibil: " << this->credit << "\n";
}

void Card::read(istream& in) {
    cout << "Dati datele cardului:\n numar card: ";
    in >> this->nrCard;
    cout << "\nNumele detinatorului: ";
    in >> this->NumeDetinator;
    cout << "\nData expirarii: ";
    in >> this->data_expirare;
    cout << "\nCVV: ";
    in >> this->CVV;
    cout<< "\ncredit: ";
    in >> this->credit;
}

class Card_Standard : Card
{
    int limitaExtragere;
    double comisionDepasireLimita;
};

class Card_Premium : Card_Standard
{
  int m;
};


int main() {

Card C;

C.print(cout);  /// error: undefined reference to vtable for Card , id returned 1 exit status;


return 0;
}


【问题讨论】:

  • FWIW,不要将钱存为double。浮点数学不精确,会导致舍入错误。相反,请使用 64 位宽的整数类型,并将其中的值存储为美分或美分的 10 次方。这为您提供了精确的整数数学运算,并且在需要显示时很容易转换为美元和美分。
  • 是的。当谈到现实世界中的金钱时,人们会变得非常奇怪。尽管这是同一个错误,但他们似乎只有在他们的钱四舍五入时才会生气。围捕他们没有问题。愚蠢、矛盾的人类。
  • 您缺少print 的非常量版本。

标签: c++ inheritance virtual


【解决方案1】:

对 vtable 的未定义引用”是编译器的说法“并非所有虚拟方法都已实现”。

实现所有virtual 成员(或将它们标记为纯),错误就会消失。

顺便说一句,virtual getCredit(); 缺少返回类型(可能是double?)。

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 2017-07-11
    • 2022-11-13
    • 1970-01-01
    • 2016-03-16
    • 2012-12-16
    • 2019-02-23
    • 2015-08-22
    相关资源
    最近更新 更多