簡體   English   中英

C ++ - 實例化派生類並使用基類的構造函數

[英]C++ - Instantiating derived class and using base class's constructor

我有一個基類,其構造函數需要一個參數(字符串)。 然后我有一個派生類,它也有自己的構造函數。 我想實例化派生類,並且能夠設置基類的構造函數的參數。

class BaseClass {
    public:
        BaseClass (string a);
};

class DerivedClass : public BaseClass {
    public:
        DerivedClass (string b);
};

int main() {
    DerivedClass abc ("Hello");
}

我不確定在調用派生類時如何設置基類構造函數的參數。

你有兩種可能性 - 內聯:

class DerivedClass : public BaseClass {
public:
    DerivedClass (string b) : BaseClass(b) {}
};

或超出范圍:

class DerivedClass : public BaseClass {
public:
    DerivedClass (string b);
};

/* ... */
DerivedClass::DerivedClass(string b) : BaseClass(b)
{}

更多例子:

class DerivedClass : public BaseClass {
public:
    DerivedClass(int a, string b, string c);

private:
    int x;
};

DerivedClass::DerivedClass(int a, string b, string c) : BaseClass(b + c), x(a)
{}

在初始化列表上:

class MyType {
public:
    MyType(int val) { myVal = val; }    // needs int
private:
    int myVal;
};

class DerivedClass : public BaseClass {
public:
    DerivedClass(int a, string b) : BaseClass(b)
    {  x = a;  }   // error, this tries to assign 'a' to default-constructed 'x'
                   // but MyType doesn't have default constructor

    DerivedClass(int a, string b) : BaseClass(b), x(a)
    {}             // this is the way to do it
private:
    MyType x;
};

如果您要做的只是從傳遞給基類構造函數的單個參數構造派生類實例,您可以這樣做:

C ++ 03(我添加了顯式,並通過const引用):

class DerivedClass : public BaseClass {
    public:
        explicit DerivedClass (const std::string& b) : BaseClass(b) {}
};

C ++ 11(獲取所有基類構造函數):

class DerivedClass : public BaseClass {
public:
    using BaseClass::BaseClass;
};

如果要調用不同的DerivedClass構造函數並將BaseClass構造函數調用為其他值,您也可以這樣做:

class DerivedClass : public BaseClass {
    public:
        explicit DerivedClass () : BaseClass("Hello, World!") {}
};

用這個

 DerivedClass::DerivedClass(string b)
     : BaseClass(b)
 {
 }

只需將參數直接傳遞給基類構造函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM