如何通过构造参数来使用私有继承

How to use private inheritance via constructing with arguments?

本文关键字:继承 何通过 参数      更新时间:2023-10-16

一些代码如下:

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(尽管它没有告诉任何人)。

除非您出于某种原因需要访问mavenprotected成员,否则这种方式不是最好的。您可能需要考虑聚合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派生的类中的方法都无法做到这一点。