首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纯虚拟类中的构造函数应该是“保护”还是“公共”?

纯虚拟类中的构造函数应该是“保护”还是“公共”?
EN

Stack Overflow用户
提问于 2014-06-04 12:07:18
回答 3查看 36K关注 0票数 18

下面的示例来自"Inside C++对象模型“一书

代码语言:javascript
复制
class Abstract_base {
public:
    virtual ~Abstract_base () = 0;
    virtual void interface () const = 0;
    virtual const char* mumble () const 
    {
        return _mumble;
    }
protected:
    char *_mumble;
};

作者说,如果我想初始化_mumble (纯虚拟基类的数据成员),应该实现一个“受保护的构造函数”

但是为什么保护呢?为什么“公共构造函数”不适合这个类?

谢谢你的回答,如果有一个例子的话,那就太好了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-04 12:12:00

这并不重要,因为无论如何都不允许您构造基类的对象。让它成为protected只会提醒我们,类应该是一个基类;它只是化妆品/文档。

考虑一下

代码语言:javascript
复制
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不会以任何方式改变程序的含义。

票数 17
EN

Stack Overflow用户

发布于 2014-06-04 12:16:46

纯虚拟类无法实例化,因此如果构造函数是公共的或受保护的,则不会产生任何影响。

公共构造函数在语法上是正确的。但是,使其受到保护将使得到一个更强的指示,即不能实例化该类。

举个例子:http://ideone.com/L66Prq

代码语言:javascript
复制
#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;
}
票数 3
EN

Stack Overflow用户

发布于 2014-06-04 12:12:21

Protecetd 将确保只由从Abstract_base派生的类调用ctor。

公共ctor不适合,因为类包含pure virtual方法!您打算如何实例化一个纯虚拟类(如果不是通过它的子类)?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24037038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档