首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用初始化列表(C++)初始化父对象的受保护成员

使用初始化列表(C++)初始化父对象的受保护成员
EN

Stack Overflow用户
提问于 2010-02-19 01:29:31
回答 3查看 53.3K关注 0票数 145

可以使用子类的构造函数的初始化列表来初始化父类中声明为受保护的数据成员吗?我不能让它工作。我可以绕过它,但如果我不是非得这样做的话就好了。

一些示例代码:

代码语言:javascript
复制
class Parent
{
protected:
    std::string something;
};

class Child : public Parent
{
private:
    Child() : something("Hello, World!")
    {
    }
};

当我尝试这样做时,编译器告诉我:“类'Child‘没有任何名为’something‘的字段”。这样的事情有可能发生吗?如果是,语法是什么?

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-19 01:33:03

用你所描述的方式是不可能的。您必须向基类添加一个构造函数(可以是受保护的)来转发它。类似于:

代码语言:javascript
复制
class Parent
{
protected:
    Parent( const std::string& something ) : something( something )
    {}

    std::string something;
}

class Child : public Parent
{
private:
    Child() : Parent("Hello, World!")
    {
    }
}
票数 139
EN

Stack Overflow用户

发布于 2022-01-19 13:50:09

正如@philsquared所说,您不能从子类的成员初始化列表中初始化父类的成员,但您可以添加一个父类构造函数,并从子类的成员初始化列表中调用此构造函数。

正如@dirkgently所说,你不能在初始化列表中初始化父类的成员的原因是因为在这一点上,父类的构造函数还没有被调用,所以这些字段不可用。

为了后人,我还想指出,如果你不想为你的父类编写一个构造函数,你可以只在构造函数的主体中初始化受保护的成员:

代码语言:javascript
复制
class Child : public Parent
{
private:
    Child() {
        something = "Hello, World!";
    }
};
票数 0
EN

Stack Overflow用户

发布于 2017-04-28 04:34:22

也许你可以使用关键字" using“来尝试一下。

代码语言:javascript
复制
class Parent
{

protected:
std::string something;
};

class Child : public Parent
{

private:
using Parent::something;
Child()
{
    something="Hello, World!";
}
};
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2290733

复制
相关文章

相似问题

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