gpt4 book ai didi

c++ - 父级上的 protected 构造函数和继承的默认构造函数不 protected

转载 作者:行者123 更新时间:2023-11-30 03:45:44 29 4
gpt4 key购买 nike

当父类受到保护时,我对继承类的默认构造函数有疑问,在我看来,子类也会有一个默认构造函数受到保护,但事实并非如此。

除了在子类上强制默认构造函数外,还有其他方法可以强制保护默认构造函数吗?

C++11 - gcc 版本 5.3.1 20151219 (Debian 5.3.1-4)。

int main ( int argc, char ** argv ) 
{
using namespace std;

class A
{
public:
static std::shared_ptr<A> CreateInstance ()
{
A * pInstance { new A };

return { pInstance, []( A * pInstance )
{
delete pInstance;
}};
};

protected:
A () = default;
~A () = default;
};

class B : public A
{
};

B b; // It's work !

return 0;
}

谢谢你的帮助,

WCdr

最佳答案

不,即使基类构造函数受到保护,派生类的自动生成的默认构造函数仍然是公共(public)的。

有两种方法(我能想到)可以防止派生类B被直接实例化:

1。移除类A中的默认构造函数

这可以通过提供一个带有伪参数的构造函数来实现:

class A
{
public:
// ...

protected:
A (int) {}
};

class B : public A
{
};

B b; // error: B::B()' is implicitly deleted because the
// default definition would be ill-formed

实例化 B 将失败,因为 B 的自动生成的默认构造函数将尝试使用 A 的默认构造函数,而该默认构造函数不存在。

但这很容易被规避:

class B : public A
{
public:
B() : A(0) {}
}

B b; // works

2。强制保护派生类的构造函数

class B
{
// ...

protected:
B() = default;
}

选项 (2) 对于阅读您的代码的其他人来说是最不令人惊讶的,并且是我推荐的选项。任何熟悉静态 createFoo 工厂函数的人都会理解为什么构造函数是私有(private)的或 protected 。


编辑

在类层次结构中使用静态create 工厂函数时,常见的用法是派生类也提供静态create 工厂函数,并将其构造函数设为私有(private)或 protected .

派生类不应使用基类的create 工厂函数。他们应该隐式或显式地调用基类构造函数。

class Base
{
public:
static shared_ptr<Base> create()
{
return shared_ptr<Base>(new Base);
}

protected:
Base() {...}
};

class Derived
{
public:
static shared_ptr<Derived> create()
{
return shared_ptr<Derived>(new Derived);
}

protected:
Derived() {...} // Implicitly calls base class default constructor
};

// Usage
auto b = Base::create();
auto d = Derived::create();

关于c++ - 父级上的 protected 构造函数和继承的默认构造函数不 protected ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34577563/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com