2010-07-28 49 views
1

与朋友,最近我们遇到了以下问题。有一个基类:禁止后代类C++中的字段

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; 
}; 

可惜的是,他还补充场在派生类(注释行)。所以下面的代码。

#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; 
} 

印刷。

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

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

TIA!

+0

foo是不是私人的代码,它是受保护这是一个完全不同的事情 – Patrick 2010-07-28 15:59:17

+0

AFAIK这是不可能的。期待阅读很多关于继承保护成员的知识并不是那么棒:o)我只能推荐Lint来检测这些情况...... – MaR 2010-07-28 16:05:34

+0

'protected'可以发展成一个蠕虫罐。谨慎使用它。通常,'public'或'private'会尽可能减少可能的混淆。 – 2010-07-28 16:23:28

回答

1

C++不具有很多的功能,以保护你从错误。它实际上没有办法知道你的意图,所以不能说出真正的错误。

+4

实际上,它具有大量的功能来保护您免受错误 - 超过大多数其他语言。但不是在这种情况下,因为这不是一个错误。 – 2010-07-28 16:00:55

6

不 - 你不应该在乎的基类的实现,所以你不应该在你的派生类的命名成员的制约。受保护的数据是一个坏主意。

+0

正如我已经说过的,在现实中foo是私人的 – GiM 2010-07-28 17:00:31

3

你可以让你所有的私有变量,然后如果变量后裔类具有相同的名称也没关系,你永远要访问正确的变量 - 更好的封装这反过来又会使你的代码更易于维护从长远来看。

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

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

将返回10以及

+0

是啊我知道,问题是在B中添加的foo是definitelly的一个错误 感谢您指出代码简化 – GiM 2010-07-28 16:54:22

0

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