将派生类构造函数参数传递给受保护的成员

Passing the derived class constructor parameter to a protected member

本文关键字:受保护 成员 参数传递 派生 构造函数      更新时间:2023-10-16

我正在尝试练习一些多态性,但我遇到了一些问题。

这是我的代码:

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++章节中介绍。

附言您应该使用现代C++的统一初始化语法,使用{...}而不是(...)。如果您使用的是未涵盖统一初始化语法的较旧的C++书籍,则应获取更新的书籍。