【问题标题】:Changing inherited function to be pure virtual将继承函数更改为纯虚函数
【发布时间】:2021-08-08 06:54:36
【问题描述】:

我想知道以下是否可能。我希望我的派生类 dAfunc() 更改为纯虚拟,以便从 dA 派生的任何类都必须实现 func()

即使ddA 没有实现func(),也可以在MSVC 下编译类似于下面的代码。

编译器确实抱怨以下代码(请参阅 cmets)。所以我现在的问题变成了:这是一种符合标准的方式来实现我想要的吗?

class A {
   public:
      virtual void func() { /* Some base implementation. */ }
}

class dA : public A {
   public:
      void func() override = 0;   // Is this valid?
}

class ddA : public dA {
}

【问题讨论】:

  • 这能回答你的问题吗? Delete virtual function from a derived class
  • 即使ddA 没有实现func(),与下面类似的代码在MSVC 下编译也不会出现问题。 您是否尝试过创建ddA 的实例。我试图在 g++ 中重现。你的例子没有抱怨编译。一旦我添加了ddA obj;,这种情况就发生了变化,因为现在这是一个问题。 (如果 func() 没有被覆盖和定义,抽象类可能不会被实例化,ddA 就是这样。)Test on coliru
  • 除此之外,我已经使用了派生类,即使基类已经实现了它,它们也会使重写的函数成为纯虚拟函数。我明确地这样做是为了使中间类不能实例化。 AFAIK,这没有任何问题,我从未注意到编译器对此有任何意外行为。 (我用的是VS2019,VS2013、VS2008都用过。)
  • @Scheff 你是对的,如果我添加ddA obj,它的行为与我预期的一样。我忘记了在我的类的情况下,它只在运行时通过脚本(通过元对象系统)被实例化,所以编译器不知道实例化。更新了问题。
  • 恕我直言,这不会改变任何事情。即使是元系统也必须在某处new 实例。这要么会抱怨不完整的类,要么(如果它是通过 hacky 技巧实现的)当某些东西试图从 v-table 为纯虚函数调用 nullptr 时,你会遇到崩溃。 (我曾经以某种方式做到了这一点,尽管我不记得我是如何做到这一点的了,在这种情况下这显然是我的错......)

标签: c++ inheritance pure-virtual


【解决方案1】:

Pure virtual 函数应该在父类中声明。考虑下面的代码: '''

class Shape {
public:
    Shape(int init_x, int init_y) : x(init_x), y(init_y) {}

    virtual void scale(int s) = 0;
    virtual void print() = 0;
protected:
    int x;
    int y;
};

这些功能应该在孩子中实现:

class Rect : public Shape {
public:
    Rect(int init_x, int init_y, int w, int h);
    virtual void scale(int s) { //implementation }
    virtual void print() { //implementation }
private:
    int width;
    int height;
};

但是你不必在子类中实现虚函数,因为它已经在超类中实现了:

纯虚函数使你的类抽象,所以你不能使用它的实例。

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 2012-08-06
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多