【问题标题】:Can Abstract class have constructor and private member in C++11抽象类可以在 C++11 中具有构造函数和私有成员吗
【发布时间】:2025-12-03 02:30:01
【问题描述】:

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

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();
};

这是我的实现文件 library.cpp

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_);
}

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是调用基础构造函数的错误方式:

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

    您所做的只是尝试创建一个 Shapes 类型的无名临时文件——这是不可能的,因为 Shapes 是纯虚拟(“抽象”)。

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

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

    这应该在你的书中解释。

    【讨论】:

      最近更新 更多