摘要类可以在C 11中具有构造函数和私人成员

Can Abstract class have constructor and private member in C++11

本文关键字:构造函数 成员      更新时间:2023-10-16

被提出类似的问题,但他们没有回答我的问题。我正在尝试创建抽象类(具有一个纯虚拟函数(。但是编译器给出了此错误:

src/library.cpp:11:24:错误:无效铸造到抽象类类型 ‘MGC ::形状’ 形状(长度,名称(;

我具有抽象类的构造函数,因为它具有成员变量和成员函数。我不知道为什么这个错误来了。

这是我的标题文件librar.h

class Shapes
{
public:
    Shapes(double len = 0.0, std::string name = "");
    virtual void printClass();
    virtual double area() = 0;
protected:
    double len_, width_;
    std::string name_;
};
class Triangle : public Shapes
{
public:
    Triangle(double lene =0, std::string namee= "" );
    void printClass();
    double area();
};

这是我的实现文件库

mgc::Shapes::Shapes(double length, std::string name)
: len_(length),
 width_(length),
name_(name)
{}
mgc::Triangle::Triangle(double length, std::string name)
{
    Shapes(length, name);
}
void mgc::Shapes::printClass()
{
    std::cout<<"Base class is called"<<std::endl;
}
void mgc::Triangle::printClass()
{
    std::cout<<"Triangle class is called"<<std::endl;
}
double mgc::Triangle::area()
{
    return(width_*len_);
}

Triangle构造函数应在初始化列表中调用基类构造函数:

mgc::Triangle::Triangle(double length, std::string name)
:   Shapes(length, name)
{
}

这是调用基本构造函数的错误方法:

mgc::Triangle::Triangle(double length, std::string name)
{
    Shapes(length, name);
}

您所做的只是尝试创建Shapes&MDASH类型的无名临时性;这是不可能的,因为Shapes是纯虚拟的("抽象"(。

当您想初始化基础和成员时,请使用成员初始列表:

mgc::Triangle::Triangle(double length, std::string name)
   : Shapes(length, name)
{}

这应该在您的书中解释。