下面的示例来自"Inside C++对象模型“一书
class Abstract_base {
public:
virtual ~Abstract_base () = 0;
virtual void interface () const = 0;
virtual const char* mumble () const
{
return _mumble;
}
protected:
char *_mumble;
};作者说,如果我想初始化_mumble (纯虚拟基类的数据成员),应该实现一个“受保护的构造函数”。
但是为什么保护呢?为什么“公共构造函数”不适合这个类?
谢谢你的回答,如果有一个例子的话,那就太好了。
发布于 2014-06-04 12:12:00
这并不重要,因为无论如何都不允许您构造基类的对象。让它成为protected只会提醒我们,类应该是一个基类;它只是化妆品/文档。
考虑一下
struct Base {
virtual ~Base() = 0;
protected:
Base() { std::puts("Base constructor"); }
};
Base::~Base() { std::puts("Base destructor"); }
struct Derived : Base {};
int main()
{
//Base b; // compiler error
Derived d;
Base *b = new Derived();
delete b;
}删除protected不会以任何方式改变程序的含义。
发布于 2014-06-04 12:16:46
纯虚拟类无法实例化,因此如果构造函数是公共的或受保护的,则不会产生任何影响。
公共构造函数在语法上是正确的。但是,使其受到保护将使得到一个更强的指示,即不能实例化该类。
举个例子:http://ideone.com/L66Prq
#include <iostream>
using namespace std;
class PublicAbstract {
public:
PublicAbstract() { }
virtual void doThings() =0;
};
class ProtectedAbstract {
protected:
ProtectedAbstract() { }
public:
virtual void doMoreThings() =0;
};
class B: public PublicAbstract {
public:
void doThings() { }
};
class C: public ProtectedAbstract {
public:
void doMoreThings() { }
};
int main() {
B b;
C c;
return 0;
}发布于 2014-06-04 12:12:21
Protecetd 将确保只由从Abstract_base派生的类调用ctor。
公共ctor不适合,因为类包含pure virtual方法!您打算如何实例化一个纯虚拟类(如果不是通过它的子类)?
https://stackoverflow.com/questions/24037038
复制相似问题