将派生类构造函数参数传递给受保护的成员
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++章节中介绍。
附言您应该使用现代C++的统一初始化语法,使用{...}
而不是(...)
。如果您使用的是未涵盖统一初始化语法的较旧的C++书籍,则应获取更新的书籍。
相关文章:
- C++:无法访问声明的受保护成员
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 同一模板类但模板类型的受保护成员
- 派生类无法访问基类的受保护成员
- 继承期间受保护成员的皮条
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 是否可以基于私有/受保护成员分配类枚举?
- 依赖模板基础的受保护成员
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 将对象强制转换为派生类以访问父类的受保护成员
- 使从一个基类派生的类能够使用继承的受保护成员
- 派生类如何使用基类的受保护成员
- 访问派生类C++中的受保护成员
- 访问基类的受保护成员
- 如何访问多个继承类中的受保护成员
- 如何从另一个类的基类访问派生类中的受保护成员
- 无法访问派生类中的基本受保护成员!(在虚函数中)
- 如何通过派生类访问基类的受保护成员?
- 如果孩子不需要父母班级的所有受保护成员,这是不好的班级设计吗?