Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不允许在派生类C++;_C++_Inheritance_Members - Fatal编程技术网

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确实是一个错误,感谢您指出代码简单化