【问题标题】:Overriding a virtual function of a nested class覆盖嵌套类的虚函数
【发布时间】:2021-07-22 06:56:12
【问题描述】:

假设我有以下课程:

class Base {
public:
    class Nested {
        virtual void display() {
            std::cout << "Not overridden" << std::endl;
        }
    };
    Nested N;
};

我还有另一个名为 Derived 的类继承自类 Base

是否可以覆盖在Nested 中声明的display() 方法,以便在Derived 类中这样做:

void display() {
    std::cout << "Overridden" << std::endl;
}

如果是这样,怎么做?

如果没有,我还有什么其他选择?

【问题讨论】:

  • 不,这不可能,这些类除了嵌套关系之外是完全独立的。
  • 由于Base 没有名为display 的方法,因此不清楚您希望从Base 派生的任何内容被覆盖。
  • TheNested N 必须是多态的(指针或引用,智能指针 std::unique_ptr&lt;Nested&gt; 在这里是一个不错的选择),然后 Derived 必须用 @ 的实例替换 N 987654333@ 而不是 Base::Nested
  • 看看 C++ iostreams,其中fstream 导致iostream 中的streambuf 成员变为filebuf,该filebuf 派生自streambuf。提示:基类实际上使用了一个指针,streambuf 声明了filebuf 覆盖的虚拟成员。
  • @BenVoigt 我还没有熟悉指针,如果不是不便,你能写一个简短的例子来解释你所说的话吗?

标签: c++ function class overriding virtual


【解决方案1】:

嵌套类(来自cppreference):

嵌套类的名字存在于封闭类的作用域中,从嵌套类的成员函数中查找名字是在检查嵌套类的作用域后访问封闭类的作用域。像它的封闭类的任何成员一样,嵌套类可以访问封闭类可以访问的所有名称(私有、受保护等),但它是独立的,并且没有对封闭类的 this 指针的特殊访问。

从 c++11 开始

嵌套类中的声明可以使用封闭类的任何成员,遵循非静态成员的通常使用规则。

这么草率地说,嵌套类是关于名称和访问成员的。就是这样。

Base 派生的类不继承方法display,因为Base 没有方法display。关于从Base 继承,几乎没有区别:

class Nested {
    virtual void display() {
        std::cout << "Not overridden" << std::endl;
    }
};

class Base {
public:
   Nested N;
};

class Derived : public Base {};

Derived 继承了成员N,但没有方法,因为Base 没有方法(除了特殊的编译器生成的方法)。

【讨论】:

  • "从 Base 继承的类不继承嵌套类。"当然可以。在Derived 内部对Nested 的不合格查找将很高兴找到Base::Nested。它没有创建一个单独的类型Derived::Nested,它继承自Base::Nested,虽然这很容易做到,但Base 的成员N 不会使用它。
  • @BenVoigt 好的,明白了。措辞不好,我想我可以删除那句话
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 2014-08-16
  • 2017-09-22
  • 2021-09-30
  • 2015-06-17
  • 2015-12-15
  • 2011-11-23
  • 2011-12-17
相关资源
最近更新 更多