覆盖父类的私人成员

时间:2011-11-10 01:49:43

标签: c++

鉴于以下类别:

class foo
{
private:
    int c;

public:
    foo( int a = 42 ) { c = a; }
    ~foo();
};

class bar: public foo
{
public:
    bar();
    ~bar();
};

如何使用不同的号码覆盖 c ?我可以这样做吗?

bar::bar() 
{
    c = 12;
}

尝试编译时出现此错误:

  

test.cpp:在构造函数‘bar::bar()’中:
  test.cpp:8:7:错误:‘int foo::c’是私有的

4 个答案:

答案 0 :(得分:5)

在构造函数初始化列表中调用基类的构造函数:

bar::bar()
  : foo(12)
{ }

顺便提一下,你应该总是更喜欢在构造函数体内使用构造函数初始化列表,因此你的foo构造函数会更好地写成:

foo( int a = 42 ) : c(a) { }

答案 1 :(得分:1)

调用基类构造函数:

bar::bar() : foo(12) { }

编辑:哎呀

答案 2 :(得分:1)

您应该为私有变量使用getter和setter方法。

所以你的电话foo应该是这样的:

class foo
{
private:
    int c;

public:
    foo( int a = 42 ) { c = a; }
    virtual ~foo();
    void setC (int tempC){
         c=tempC;
    }
    int getC() const{
        return c;
    }
};

在B的构造函数中,您可以将它们称为setter方法:

bar::bar() 
{
    setC(12);
}

然后,您应该始终使用setter和getter方法来访问变量,而不是直接访问它。

您还应该声明基类的析构函数是虚拟的。

答案 3 :(得分:0)

怎么样?
bar::bar() : foo(12) {}