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

时间:2019-09-14 12:48:14

标签: c++ polymorphism

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

这是我的代码:

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(){};
};

我知道加入私人会员时我尝试过的方法是可行的,但是我想知道是否有某种方法也可以使第一次尝试也可行。

谢谢!

1 个答案:

答案 0 :(得分:1)

C ++无法以这种方式工作。只有类的构造函数才能初始化其成员。

只有A的构造函数可以初始化其类成员。这就是构造函数的工作。派生类不能初始化其基类的成员,而只能初始化自己的类成员。基类仅初始化基类的成员。派生类的构造函数只能初始化其自己类的成员。

您需要做的是向A添加一个可能是受保护的构造函数的构造函数,并使用一个参数来初始化带有以下参数的类成员:

class A {

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

// ...
};

并让派生类的构造函数显式调用此构造函数。

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

在某些情况下,您也可以委派构造函数,作为替代方法。这应该在您的C ++书籍的高级C ++章节中进行介绍。

P.S。您应该使用现代C ++的统一初始化语法,而不是{...},而是使用(...)。如果您使用的是一本不包含统一的初始化语法的C ++书籍,则应该获得一本较新的书籍。