和朋友一起,我们最近遇到了以下问题。有一个基类:
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!
答案 0 :(得分:6)
不 - 您不应该关心基类的实现,因此您不应该在派生类的命名成员中受到限制。受保护的数据是一个坏主意。
答案 1 :(得分:3)
您可以将所有变量设为私有,如果变量在后续类中具有相同的名称并不重要,您将始终访问正确的变量 - 更好的封装,这反过来将使您的代码更容易维护从长远来看。
PS:你的测试用例不需要那么复杂:
B b;
b.process();
b.getfoo();
也将返回10
答案 2 :(得分:1)
C ++没有很多功能来保护您免受错误的侵害。它实际上没有任何方法可以知道你的意图,因此无法分辨出真正的错误。
答案 3 :(得分:0)
不是语言本身,但可以将某些编译器配置为将某些类型的警告报告为错误。请参阅编译器文档以供参考。