通过构造函数设置子类属性:不好的做法?

时间:2016-08-18 02:10:47

标签: c++ oop inheritance

我使用基类来声明主要属性和函数来操作我稍后定义的类族的那些属性。我发现在子类中重新定义类变量实际上没有任何效果,并且定义了set_attribute()类型成员来设置值,如下所示。

代码:

#include <iostream>

class Base {
public:
    void set_val(const char& c) { val = c; }
    void print_val() { std::cout << "Val = " << val << std::endl; }
protected:
    char val = 'a';
};

class Derived : public Base {
private:
    char val = 'c'; // No effect
    char derived_val = 'b';
public:
    // Constructor assigns derived_val to val
    Derived() { set_val(derived_val); }; 
};

int main(int argc, const char * argv[]) {
    Base base;
    base.print_val(); // 'a'
    Derived derived;
    derived.print_val(); // 'b'
}

输出:

Val = a
Val = b

现在这样可行,但我不确定它是否是最好的方法,或者即使以这种方式使用类继承也是一种好习惯。有人可以启发我吗?

1 个答案:

答案 0 :(得分:2)

我不能确切地说这是不好的做法,完全没必要。

原因

char val = 'c';

无效,因为您在val中定义了一个新的Derived,隐藏了val中的Base。当您致电print_val时,它只会看到Base::val,而不是Derived::val。所以它会打印Base::val

您可以直接在Base::val的构造函数中更改Derived,而不是重新定义它:

Derived() { val = 'c'; }