我正在尝试练习某种多态性,但遇到了一些问题。
这是我的代码:
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(){};
};
我知道加入私人会员时我尝试过的方法是可行的,但是我想知道是否有某种方法也可以使第一次尝试也可行。
谢谢!
答案 0 :(得分:1)
C ++无法以这种方式工作。只有类的构造函数才能初始化其成员。
只有A
的构造函数可以初始化其类成员。这就是构造函数的工作。派生类不能初始化其基类的成员,而只能初始化自己的类成员。基类仅初始化基类的成员。派生类的构造函数只能初始化其自己类的成员。
您需要做的是向A
添加一个可能是受保护的构造函数的构造函数,并使用一个参数来初始化带有以下参数的类成员:
class A {
// ...
A(int value) : __value{value} {}
// ...
};
并让派生类的构造函数显式调用此构造函数。
B(int value) : A{value}
{
}
在某些情况下,您也可以委派构造函数,作为替代方法。这应该在您的C ++书籍的高级C ++章节中进行介绍。
P.S。您应该使用现代C ++的统一初始化语法,而不是{...}
,而是使用(...)
。如果您使用的是一本不包含统一的初始化语法的C ++书籍,则应该获得一本较新的书籍。