抽象类的 C++ 保护构造函数

标签 c++ constructor

我试图找出抽象基类的公共(public)构造函数和 protected 构造函数之间的区别。 假设我有两个类(class):

抽象基类:怪物

class Monster
{
public: // or protected?? what is the techincal difference?
    Monster(string name)
    {
        _name = name;
    }
public:
    virtual void attack() = 0;

    const string getName() const
    {
        return _name;
    }

private:
    string _name;

};

具体子类:Spider

class Spider : public Monster
{
public:
    Spider(string name) : Monster(name)
    {

    }

    void attack() override
    {
        cout << getName() << ":(Spider) is attacking!" << endl;
    }
};

现在如果我尝试创建一个 Monster 实例:

int main()
{
    Monster monster1 { "Abstract Monster Not Allowed" }; // Error
}

错误: 不允许抽象类类型“Monster”的对象: Monster::Attack 是一个纯虚函数。

这完全有道理,但是“公共(public)构造函数”是抽象类中“ protected 构造函数”的别名吗? 在哪种情况下我可以为抽象类使用 protected 构造函数?

提前致谢。

最佳答案

将硬币视为抽象基类。你不想直接实例化一个硬币对象,但你会想要构造具有不同属性(如原产国、面值)的派生类型的硬币,然后相应地设置属性,如尺寸、重量和制造它们的 Material 的。我们不希望在某个容器中放置一堆硬币基类,因为没有足够的信息来描述该硬币对象。因此这个硬币对象是抽象的或者是一个概念。但是,此硬币基类的派生对象(例如美国银元或德国法郎等)是可以实例化的真实对象,因为它们是真实对象,并且在构造它们时已知关于它们的足够信息。

由于其性质以及类封装的工作方式,即使基类不是抽象的,这意味着不需要纯虚函数,因此硬币基类的构造函数应该受到保护!即使您确实需要在这个 coin 类中使用纯虚方法,保护构造函数仍然是一个好习惯。当其他人查看您的类接口(interface)并看到 protected 构造函数时,这会使源代码对其他人更具可读性。他们知道这个类不能直接实例化。

现在让我们说另一个类具有“硬币”类的关系,例如银行类或造币厂类,其中造币厂类创造硬币而银行类持有硬币,这些类可能可以拥有 protected 硬币构造函数的 friend 访问修饰符,以便他们可以在任何信息可用之前创建这些硬币的实例,并将它们存储到容器中以供以后处理。将此视为预批处理操作,并且使用此布局,硬币基类用作模板(而不是 C++ 编程模板)。

关于抽象类的 C++ 保护构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32168669/

相关文章:

c++ - 为什么 std::move 采用 forward_reference 而不是 lvaue 引用

c++ - 文件本地定义

c++ - C++ 中自定义类的 HashMap 中的默认值

c++ - 如何在已分配的内存上调用构造函数?

java - 为什么我的 Java 代码在对象声明后停止响应?

c# - 新的运算符或构造函数是否会阻止.NET中的其他线程?

c++ - 在 C++ 中实现接口(interface)的问题

哈希表和链接列表的 C++ 访问冲突

c++ - 使用 g++-arm-linux-gnueabi 时包含 C++ 系统头文件的正确方法?

C++ 构造函数不会传递字符串 - 未定义构造函数