1

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

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是私有的),这将不允许在后代类中声明具有相同名称的变量(例如通过导致编译时错误)。

蒂亚!

4

4 回答 4

6

不——你不应该关心基类的实现,所以你不应该被限制在派生类中命名成员。受保护的数据是个坏主意。

于 2010-07-28T15:59:37.137 回答
3

您可以将所有变量设为私有,那么无论变量在后代类中是否具有相同的名称,您将始终访问正确的变量 - 更好的封装反过来将使您的代码更易于长期维护.

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

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

也会返回 10

于 2010-07-28T16:09:13.143 回答
1

C++ 没有很多功能可以保护您免受错误的影响。它真的没有办法知道你的意图,因此无法判断什么是真正的错误。

于 2010-07-28T15:59:24.840 回答
0

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

于 2010-07-28T16:30:34.333 回答