我试图找出抽象基类的公共(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/