【问题标题】:C++ virtual function ignoring scope specifierC++ 虚函数忽略范围说明符
【发布时间】:2015-04-12 05:22:09
【问题描述】:

请参考以下C++代码:

#include <iostream>

class A {
public:
    virtual ~A() {}
    virtual void display() {
        std::cout << "Display A"  << std::endl;
    }
};

class B : public A {
    // ! NO 'display()' function in this class.
};

class C : public B {
public:
    void display() {
        std::cout << "Display C" << std::endl;
        B::display();
    }
};


int main(void) {
    A* ptr = new C();
    ptr->display();
    delete ptr;

    return 0;
}

这是这个程序的输出:

Display C 
Display A

我希望这个程序有一个编译错误,因为 B::display() 没有定义。

有人能解释一下这段代码的行为吗?

非常感谢您的宝贵时间!

【问题讨论】:

  • BA 继承 display 实现
  • 完美。这就说得通了。谢谢!

标签: c++ scope polymorphism virtual vtable


【解决方案1】:

谁能解释这段代码的行为?

B 只是从A 继承display 函数。因为,它是虚拟的 B 可以覆盖行为以成为不同的东西(即,如果它需要不同的实现,它可以创建一个,否则它可以采用它继承的东西)。

【讨论】:

    【解决方案2】:

    您将虚函数误认为是抽象函数。 函数是虚拟的,因为它有一个 vtable 条目,可以被基类的子类覆盖。但是基类不需要覆盖条目。

    例如,B::display() 的 vtable 条目是 A::display(),这就是您在示例中看到的。

    为了完整起见,您可以像这样在 C++ 中声明抽象函数:virtual void display() =0;,没有主体。必须为 C++ 重写此函数以允许您实例化类类型,否则您将收到编译错误。

    【讨论】:

      【解决方案3】:

      根据 C++ 标准(10 个派生类)

      1. ...除非在派生类中重新声明,否则基类的成员是 也被认为是派生类的成员。基类 成员被称为由派生类继承。 继承 成员可以以与其他成员相同的方式在表达式中引用 派生类的成员,除非他们的名字是隐藏的或 模棱两可...

      所以你可以在类 B 中引用继承的成员函数 display 在类 A 中声明的方式与类 B 的其他成员相同。

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 1970-01-01
        • 2016-01-15
        • 2012-03-14
        • 1970-01-01
        • 2022-01-14
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多