【问题标题】:Are only virtual methods overridden [duplicate]是否只有虚拟方法被覆盖[重复]
【发布时间】:2016-01-24 10:12:08
【问题描述】:

我试图理解 C++ 中的 virtualpure-virtual 函数。我开始知道在派生类中,虚拟方法被派生类中给出的实现覆盖。

这是我用来测试的代码:

#include <iostream>

using namespace std;


class Base
{
    protected:
    int a;
    public :
    virtual void modify ()
    {
        a=200;
    }
    void print ()
    {
        cout<<a<<"\n";
    }
};
class Derived : public Base
{
    int b;
    public :
    void modify()
    {
        a=100;
        b=10;
    }
    void print ()
    {
        cout<<a<<"\t"<<b<<"\n";
    }
};
int main ()
{
    Base b;
    b.modify ();
    b.print ();

    Derived d;
    d.modify ();
    d.print ();

return 0;
}

输出:

200
100   10

这意味着print () 也与modify () 一起被覆盖。

我的问题:

那我们为什么还需要虚方法...?

【问题讨论】:

  • “这意味着 print () 也与 modify () 一起被覆盖。”不,不是这个意思。在第二种情况下,Derived 实例被用来调用print 函数,这就是发生的事情。
  • @JamesAdkison 实际上,是的,它确实意味着它被覆盖了。调用的方法是实际对象类型的重写方法。 virtual 的用途是,所有虚拟版本(因为“它实际上是同一个对象”)都会调用被覆盖的对象,无论它被转换为哪种对象类型。它们为您提供了额外的语言能力,可以选择在转换为不同类型时要保持覆盖的语言。这就是多态的真正力量。
  • @Puddle Derived::print 函数是非虚拟的,它会影响 Base::print 函数,而不是 override 它。
  • @JamesAdkison 它确实覆盖了方法。是否是多态是一个单独的概念。但是当然,根据非多态覆盖方法的技术术语,您将其称为阴影是正确的。但在全球智能感知理解中,它仍然只是另一种说法,被覆盖,而不是多态。大声笑
  • 多态性——以多种形式出现的能力

标签: c++ inheritance virtual-functions


【解决方案1】:

在您的代码示例中考虑这种情况:

Base* b = new Derived();
b->modify();
b->print();

即使b 指向 Derived 的一个实例,虚方法b-&gt;modify 的调用也会正确调用Derived::modify。但是,b-&gt;print 的调用(未声明为虚拟)将打印 200\n 而没有前导 \t 字符,就像在 Derived::print 中一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 2011-11-06
    • 2013-01-15
    • 2012-11-28
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多