C++ 不允许在派生类C++;
和一个朋友一起,我们最近遇到了以下问题。有一个基类:C++ 不允许在派生类C++;,c++,inheritance,members,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; };
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;
}
#包括
int main()
{
A*aaa=NULL;
如果(1){
B*bbb=新的B;
bbb->process();
aaa=bbb;
}
std::cout getFoo()C++没有很多功能来保护您免受错误的伤害。它实际上没有任何方法知道您的意图,因此无法判断什么是真正的错误。C++没有很多功能来保护您免受错误的伤害。它实际上没有任何方法知道您的意图,因此无法判断什么是真正的错误。No-您不应该关心基类的实现,因此不应该限制您命名派生类中的成员。而受保护的数据是一个坏主意。否-您不应该关心基类的实现,因此不应该限制您命名派生类中的成员。并且保护数据是一个坏主意。您可以将所有变量设置为私有的,那么不管变量在派生类中是否具有相同的名称,您将始终访问正确的变量-更好的封装,这反过来会使您的代码更易于长期维护
PS:您的测试用例不需要如此复杂:
B b;
b.process();
b.getfoo();
也将返回10您可以将所有变量设置为私有变量,那么无论变量在子类中是否具有相同的名称,您将始终访问正确的变量-更好的封装,从而使代码更易于长期维护
PS:您的测试用例不需要如此复杂:
B b;
b.process();
b.getfoo();
也将返回10,但某些编译器可以配置为将某些类型的警告报告为错误。请参阅编译器文档以获取参考。不使用语言本身,但某些编译器可以配置为将某些类型的警告报告为错误。请参阅编译器文档n供参考。foo在代码中不是私有的,它是受保护的,这是一个完全不同的东西,这是不可能的。期待阅读大量关于继承受保护成员的内容不是一个好主意:o)我只能推荐Lint来检测这些情况…protected
可以发展成一罐蠕虫。谨慎使用。通常public
或private
可以做任何你需要做的事情,而不会有太多的混淆。你的例子会泄露。至少,删除它(并给一个虚拟析构函数),或者将其粘贴在自动\u ptr
中。或者只是不动态分配。@GIM总是在这里-发布真实的代码!!!!!我真不敢相信这一点-我投了反对票。foo在代码中不是私有的,它是受保护的,这是一个完全不同的东西,这是不可能的。期待阅读大量关于继承受保护成员的内容是不可能的好主意:o)我只能推荐Lint来检测这些情况…受保护的
可能会发展成一罐蠕虫。谨慎使用。通常,public
或private
会做任何你需要做的事情,而不太可能造成混淆。你的示例会泄漏。至少,删除它(并给a
一个虚拟析构函数),或者把它放在一个auto_ptr
。或者只是不动态分配。@GIM总是在这里-发布真实的代码!!!!!我真不敢相信-我投了反对票。事实上,它有大量的功能来保护你不出错-比大多数其他语言都多。但在这种情况下不是,因为它不是一个错误。事实上,它有大量的功能可以保护您免受错误的影响-比大多数其他语言都多。但在这种情况下不是这样,因为这不是一个错误。是的,我知道,问题是在B中添加的foo确实是一个错误,感谢您指出代码简化是的,我知道,问题是在B中添加的foo确实是一个错误,感谢您指出代码简单化