【问题标题】:problem with class considered like abstract class but whitout virtual pure method将类视为抽象类但没有虚拟纯方法的问题
【发布时间】:2020-12-23 03:14:04
【问题描述】:

我对抽象类有疑问。 我已经声明了两个类 Valeur(抽象类)和 Boolleen

Valeur.hh

#pragma once
#include <memory>
namespace common {

class Valeur {
public:
    virtual bool operator==(Valeur const& v) const =0;
};
class Boolleen : public Valeur {
private:
    bool _b;
public:
    Boolleen (bool b);
    bool operator==(Valeur const& v);

};

}

Valeur.cpp

#include "valeur.h"
using namespace common;

Boolleen::Boolleen(bool b): Valeur(), _b(b) {}

bool Boolleen::operator==(Valeur const& v) {
    return true;
}

ma​​in.cpp

#include "valeur.h"
int main()
{
    common::Boolleen b(true); // DOESN'T WORK ???
    return 0;
}

当我尝试实例化 Boolleen 类时,编译器告诉我它是一个抽象类,但我没有在 Boolleen 中声明纯虚方法。 我希望能够无忧无虑地构建一个 Boolleen 对象

【问题讨论】:

  • virtual bool operator==(Valeur const&amp; v) const =0; 末尾有一个const。这使得它与bool operator==(Valeur const&amp; v); 的功能不同,const 的功能不同
  • 虚拟operator== 是一个糟糕的设计。在此示例中,您将把 Boollean 与任何从 Valeur 派生的对象进行比较,并忽略基础之外的所有内容。或者,您在编程时需要知道派生类的完整列表Boollean

标签: c++ constructor abstract-class pure-virtual


【解决方案1】:

您没有实现Boolleen::operator==(const Valeur &amp;v) const,因此它是一个抽象类,因为其中一个方法仍然是纯虚拟的(来自 Valeur 的相等运算符)。密切注意签名:)

为避免将来出现此类错误,无论何时您打算覆盖虚拟方法,请在声明后添加override。这样,如果重写的方法具有不正确的签名,编译器将不会让您编译代码。

【讨论】:

  • @Monsieur AZERTY 没问题。睡觉是必要的:)
猜你喜欢
  • 2015-05-01
  • 2016-01-25
  • 2010-10-11
  • 1970-01-01
  • 2013-01-15
  • 2012-10-01
  • 1970-01-01
  • 2019-01-01
相关资源
最近更新 更多