c++ - 选择性继承 C++

标签 c++ inheritance

您能否解释一下为什么以下代码可以编译并且工作正常(在 gcc-4.3.4 上检查)。我认为选择性继承不能削弱甚至加强对成员/方法的访问。不破坏封装规则吗?

#include <iostream>

class A {
protected:
    void foo() { std::cout << "foo" << std::endl;  }
};

class B : private A {
public:
    using A::foo;   //foo() becomes public?!
};

int main() {
    B b;
    b.foo();
    return 0;
}

最佳答案

从语言的角度来看,这并没有什么问题(设计好不好是另外一回事)。

任何类(class)都可以选择向更广泛的受众公开它可以访问的内容。

原则上,您的示例与以下内容没有什么不同:

class B : private A {
public:
    void bar() { foo(); }
};

除了这里 foo() 是通过代理暴露的。

您不能做的恰恰相反:公共(public)派生类不能限制对可通过基类访问的事物的访问。

关于c++ - 选择性继承 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13933926/

相关文章:

c++ - 将类型声明为类型模板参数的模板参数的一部分是否合法?

c++ - 如何在缓冲控制台输出中输出?

c++ - 给定抽象基类 X,如何创建另一个模板类 D<T>,其中 T 是从 X 派生的类的类型?

c++ - 是否有可能从基类函数 "inherit"派生函数?

c# - 做继承权

c++ - 如何将 const void* 转换为 unsigned int?

c++ - 如何使用 Boost C++ 遍历递归变量 vector

c++ - 使用用户生成的文件名创建 ifstream?

generics - Kotlin继承/泛型声明

Python 继承和关键字参数