【问题标题】:Appended '= x' after a method declaration in c++在 C++ 中的方法声明之后附加 '= x'
【发布时间】:2011-04-02 20:16:35
【问题描述】:

在 C++ 中,当声明一个方法时,我注意到有时该方法可能会附加一个赋值。

谁能告诉我这是什么?

例如:

virtual void MyMethod () = 0;

“= 0”是什么意思。 :)

谢谢大家!!!

【问题讨论】:

  • 我认为你的意思是 C++...
  • C# 只是流交叉的 C++。 (不要越过溪流)
  • 谢谢大家,我理解它就像一个必须在子类中重写(实现)的抽象方法。
  • C++0x 将引入x 的一些新的合法值而不是0: delete 以指定函数不存在(删除默认构造函数或赋值运算符,或防止隐式转换)和default 显式指定函数的默认实现。

标签: c++ syntax language-features


【解决方案1】:

这意味着它是一个纯虚函数,即在这个类中没有可用的实际定义,它必须在子类中被覆盖。它实际上并不是这样的赋值,零是唯一可以“赋值”的值。

这是 C++ 语法;在 C# 中,使用 abstract 关键字可以实现相同的功能。

【讨论】:

  • 这是假设 OP 的意思是 C++,他可能就是这么做的。在 C# 中,与此等效的是标记方法 abstract 而不是给它一个主体。
  • 甚至任何零值都不会成立。 这里只有0 有效,它直接作为语法符号。 0L 或其他方法不起作用。即,虽然它可能在某些编译器上使用 NULL 代替(因为它为它们扩展为 0),但在其他编译器上它可能不起作用:)
  • 没有定义的说法不一定正确。相反,它只是意味着派生类需要实现该功能。如果不是,则无法实例化。
  • GMan 是正确的。即使您将析构函数设为纯虚拟,您仍然需要为其提供定义。纯虚表示函数必须在任何子类中定义,然后才能实例化该子类。
  • @calmh:不,您仍然声称“没有可用的实际定义”。 Bill 甚至提出了一个实际定义必须可用的示例。
【解决方案2】:

在 C# 中,这是一个语法错误。

如果您指的是 C++,请参阅 Calmh 的回答。

【讨论】:

    【解决方案3】:

    在 C++ 中,这意味着该方法是纯虚方法。

    这意味着这个特定类类型的实例不能被实例化。您只能创建派生自此的类的实例,这些实例会覆盖基类中的所有纯虚方法。

    具有纯虚方法的基类定义了派生类具有要实现的接口,并且不能单独使用。


    与 Calmh 声称的相反,据我所知,纯虚函数可以实现,并且可以显式调用。

    #include <cstdio>
    
    class A
    {
    public:
        virtual void foo() const = 0; //pure virtual
    };
    
    void A::foo() const { puts("A::foo"); }
    
    class B: public A
    {
    public:
        virtual void foo() const { puts("B::foo"); }
    };
    
    int main()
    {
        //A a;  //this would be an error - main point of having pure virtual functions
        B b;
        b.foo();
        b.A::foo();
    }
    

    不过,通常人们不会这样做,除非虚拟析构函数在基类中是纯的(在这种情况下,它必须被定义)。

    【讨论】:

    • 另外,(现在,我正在进入一个有点迂腐的模式)与他所写的相反,任何子类都可以不覆盖它。然后它也将是抽象的,但如果没有人创建它的对象(反过来作为基类子对象除外),那很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2021-06-15
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多