禁止下载类C ++中的字段

时间:2010-07-28 15:54:08

标签: c++ inheritance members

和朋友一起,我们最近遇到了以下问题。有一个基类:

class A {
public:
    A() : foo(10) {}
    virtual int getFoo() const { return foo; }

protected:
    int foo;
};

一位朋友实施了一个源自上面的类。

class B : public A {
public:
    void process() { foo = 666; }
protected:
    //int foo;
};

不幸的是,他还在后代类(注释行)中添加了字段 foo 。所以下面的代码。

#include <iostream>

int main()
{
    A* aaa= NULL;
    if (1) {
        B* bbb = new B;
        bbb->process();
        aaa = bbb;
    }

    std::cout << aaa->getFoo() << std::endl;

    return 0;
}

打印 10

这不是问题,因为这将完全重新设计,将来不会发生这样的事情。

我只是想知道,你知道任何(便携式)技巧或语言模式(除了明显的getter / setter;顺便说一下他们实际上是在那里, foo 是私有的),禁止在后代类中声明具有相同名称的变量(例如,通过导致编译时错误)。

TIA!

4 个答案:

答案 0 :(得分:6)

不 - 您不应该关心基类的实现,因此您不应该在派生类的命名成员中受到限制。受保护的数据是一个坏主意。

答案 1 :(得分:3)

您可以将所有变量设为私有,如果变量在后续类中具有相同的名称并不重要,您将始终访问正确的变量 - 更好的封装,这反过来将使您的代码更容易维护从长远来看。

PS:你的测试用例不需要那么复杂:

B b;
b.process();
b.getfoo();

也将返回10

答案 2 :(得分:1)

C ++没有很多功能来保护您免受错误的侵害。它实际上没有任何方法可以知道你的意图,因此无法分辨出真正的错误。

答案 3 :(得分:0)

不是语言本身,但可以将某些编译器配置为将某些类型的警告报告为错误。请参阅编译器文档以供参考。