可以使用子类的构造函数的初始化列表来初始化父类中声明为受保护的数据成员吗?我不能让它工作。我可以绕过它,但如果我不是非得这样做的话就好了。
一些示例代码:
class Parent
{
protected:
std::string something;
};
class Child : public Parent
{
private:
Child() : something("Hello, World!")
{
}
};
当我尝试这样做时,编译器告诉我:“类'Child‘没有任何名为’something‘的字段”。这样的事情有可能发生吗?如果是,语法是什么?
非常感谢!
发布于 2010-02-19 01:33:03
用你所描述的方式是不可能的。您必须向基类添加一个构造函数(可以是受保护的)来转发它。类似于:
class Parent
{
protected:
Parent( const std::string& something ) : something( something )
{}
std::string something;
}
class Child : public Parent
{
private:
Child() : Parent("Hello, World!")
{
}
}
发布于 2022-01-19 13:50:09
正如@philsquared所说,您不能从子类的成员初始化列表中初始化父类的成员,但您可以添加一个父类构造函数,并从子类的成员初始化列表中调用此构造函数。
正如@dirkgently所说,你不能在初始化列表中初始化父类的成员的原因是因为在这一点上,父类的构造函数还没有被调用,所以这些字段不可用。
为了后人,我还想指出,如果你不想为你的父类编写一个构造函数,你可以只在构造函数的主体中初始化受保护的成员:
class Child : public Parent
{
private:
Child() {
something = "Hello, World!";
}
};
发布于 2017-04-28 04:34:22
也许你可以使用关键字" using“来尝试一下。
class Parent
{
protected:
std::string something;
};
class Child : public Parent
{
private:
using Parent::something;
Child()
{
something="Hello, World!";
}
};
https://stackoverflow.com/questions/2290733
复制相似问题