簡體   English   中英

將派生的類構造函數參數傳遞給受保護的成員

[英]Passing the derived class constructor parameter to a protected member

我正在嘗試練習一些多態性,但遇到了一些問題。

這是我的代碼:

class A{   //the base
public:
    A(){}
    virtual void Log(){};
    virtual ~A(){};
private:
protected:
    int __value;
};

class B : public A{   //the derived 
public:
    B(int value):__value(value){}   //here's the problem
    void Log() override{
        std::cout<<__value<<"\n";
    }
    ~B(){};
};

那行的錯誤說:“類'B'沒有任何名為'__value'的字段”。 如果我將以這種方式做到這一點,它將起作用:

class A{
public:
    A(){}
    virtual void Log(){};
    virtual ~A(){};
private:
protected:
    int __value;
};

class B : public A{
public:
    B(int value){
        __value=value;
    }
    void Log() override{
        std::cout<<__value<<"\n";
    }
    ~B(){};
};

我知道我加入私有成員時嘗試過的方法是可行的,但是我想知道是否有某種方法也可以使第一次嘗試也可行。

謝謝!

C ++無法以這種方式工作。 只有類的構造函數才能初始化其成員。

只有A的構造函數可以初始化其類成員。 這就是構造函數的工作。 派生類不能初始化其基類的成員,而只能初始化自己的類成員。 基類僅初始化基類的成員。 派生類的構造函數只能初始化其自己的類的成員。

您需要做的是向A (可能是受保護的構造函數)添加一個構造函數,並使用一個參數初始化該類成員的參數:

class A {

// ...
   A(int value) : __value{value} {}

// ...
};

並讓派生類的構造函數顯式調用此構造函數。

B(int value) : A{value}
{
}

在某些情況下,您也可以委派構造函數作為替代。 這應該在C ++書籍的高級C ++章節中介紹。

PS您應該使用現代C ++的統一初始化語法,並使用{...}而不是(...) 如果您使用的是較舊的C ++書籍,但沒有涵蓋統一的初始化語法,則應該獲得較新的書籍。

暫無
暫無

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

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