如何通过构造参数来使用私有继承
How to use private inheritance via constructing with arguments?
一些代码如下:
class maven
{
private:
string username;
public:
maven(string un)
{
username = un;
}
};
class car : private maven
{
public:
/... do something .../
};
然后我想要在对象车中获得一个maven实例。但是我怎样才能用argument构造maven对象呢?我查了说明书和注释。
如果您的意思是如何构造car
对象的maven
部分,请使用初始化列表:
class car : private maven
{
public:
// This way
car() : maven("foo") {
}
// Or this way
car(string username) : maven(username) {
}
};
值得注意的是,通过这种方式,您不会在car
中获得maven
实例;实际上,car
本身就是一个内心深处的maven
(尽管它没有告诉任何人)。
除非您出于某种原因需要访问maven
的protected
成员,否则这种方式不是最好的。您可能需要考虑聚合类maven
的对象,例如:
class car
{
private:
maven m_maven;
public:
// Initialize the member with a default parameter
car() : m_maven("foo") {
}
// Or this way
car(string username) : m_maven(username) {
}
};
有关简短讨论,请参阅C++FAQ lite的此页。
在car
中创建一个构造函数,并在初始化列表中初始化其基maven
。
class car : private maven
{
public:
car(string un) : maven(un)
{
}
};
class car : private maven
{
public:
car() : maven("some_username")
{
}
};
关于私有继承和组合之间的区别,请参阅Jon的答案,但如果您想访问maven
实例,因为有一个类似的函数:
void baz(maven*);
然后,在这两种情况下,只有car
的成员和朋友可以访问maven
实例,因此给定car
的成员,例如car::zoo
:
在私人继承的情况下:
car::zoo(){ baz(this); }
或者在组合物的情况下:
car::zoo(){ baz(&m_maven); }
在这两种情况下,car
之外的其他函数或方法,以及从car
派生的类中的方法都无法做到这一点。
相关文章:
- 通过继承类使用来自不同命名空间的运算符
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- C++ 通过接口使用从其他几个类继承的类
- 通过继承重载运算符会导致歧义
- C++排除通过派生类中的基类继承的类
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 是否可以通过使用 std::variant 来避免继承
- 无法调用通过两个类继承的虚拟方法
- 通过模板类继承满足纯虚函数合约
- 子类是否也在 c++ 中继承私有数据成员?但通过超类的公共方法访问
- 通过void指针通过C ABI传递C++对象(可能具有多个虚拟继承)
- 通过将指向"this"的指针传递给基构造函数来消除C++菱形继承
- 有关通过派生类在命名空间内继承的问题
- 通过多个继承的对象大小
- 通过相同的纯虚拟方法,来自不同抽象基础的C 多重继承
- 通过类型C++ 的继承树递归导致此指针问题
- 在 C# 中通过继承将私有方法添加到类
- GCC 看不到通过多重继承实现
- 我如何通过继承将模板参数传递到模板的子类
- 通过继承访问受保护的成员