c++ - 名称隐藏和脆弱的基础问题

标签 c++ oop inheritance

我看到它声明 C++ 隐藏名称是为了减少脆弱的基类问题。但是,我绝对看不出这有什么帮助。如果基类引入了以前不存在的函数或重载,它可能与派生类引入的函数或重载冲突,或者对全局函数或成员函数的非限定调用——但我没有看到这与重载有何不同.为什么要区别对待虚函数的重载与其他任何函数?

编辑:让我再向您展示一下我在说什么。

struct base {
    virtual void foo();
    virtual void foo(int);
    virtual void bar();
    virtual ~base();
};
struct derived : base {
    virtual void foo();
};

int main() {
    derived d;
    d.foo(1); // Error- foo(int) is hidden
    d.bar(); // Fine- calls base::bar()
}

这里,foo(int)bar() 的处理方式不同,因为它是一个重载。

最佳答案

我假设“脆弱的基类”是指对基类的更改可能会破坏使用派生类的代码(这是我在 Wikipedia 上找到的定义)的情况。我不确定虚函数与此有什么关系,但我可以解释一下隐藏如何有助于避免这个问题。考虑以下几点:

struct A {};

struct B : public A
{
    void f(float);
};

void do_stuff()
{
    B b;
    b.f(3);
}

do_stuff 中的函数调用调用B::f(float)

现在假设有人修改了基类,并添加了一个函数void f(int);。如果不隐藏,这将更好地匹配 main 中的函数参数;您要么更改了 do_stuff 的行为(如果新函数是公共(public)的),要么导致编译错误(如果它是私有(private)的),而没有更改 do_stuff 或任何它的直接依赖关系。使用隐藏,您并没有改变行为,只有当您使用 using 声明明确禁用隐藏时,这种破坏才有可能。

关于c++ - 名称隐藏和脆弱的基础问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5928535/

相关文章:

c++ - 图书馆如何实现不同操作系统之间的可移植性

c++ - static_cast 和 dynamic_cast 在特定场景中的不同行为

c++ - 指向基类的唯一指针

c++ - operator [] 在 vector 类上重载

c++ - 线段树的实现

c++ - 适当的析构函数中应该包含什么?

C++ FLTK,创建圆角框

node.js - 在 Express REST API 中使用 OOP 的最佳方式?

php - php中单个对象和多个对象类的接口(interface)或类型提示

c# - 抽象类中的抽象属性。重点是什么?