[英]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.