【问题标题】:Defining pure virtual functions outside the class definition在类定义之外定义纯虚函数
【发布时间】:2015-04-04 17:40:04
【问题描述】:

显然,内联定义是不允许的。

所以,我想知道这种使用二进制范围解析运算符在类定义之外定义纯虚函数的做法在哪些情况下有用

我能想到的一个场景是假设所有派生类在纯虚函数定义中都有一些共同的代码/功能,并且共同的功能可以包含在纯虚函数本身的基类定义和基类版本中纯虚函数的定义可以在派生类的纯虚函数定义中调用。 (但不确定语法是否有效)。

【问题讨论】:

  • (对我而言)“不允许内联定义[纯虚函数]”并不是那么明显。关键字“inline”在任何地方都不会产生警告或错误(在 ubuntu 上使用 gcc 4.8.1)。所以也许我不确定你会把“内联”放在哪里来生成警告/错误?
  • @DOUGLASO.MOEN 我认为 OP 意味着在类中定义它(这使得它自动内联)。我同意使用inline Foo::f() 有效。虽然一般来说虚函数不应该是inline,因为编译器会在运行时决定运行哪一个。

标签: c++


【解决方案1】:

确实,当您想要调用在基类的纯虚成员函数中定义的通用功能时。

(不确定语法是否有效)。

它是这样工作的:

#include <iostream>
#include <memory>

struct Foo
{
    virtual void f() = 0;
    virtual ~Foo() = default;
};

void Foo::f()
{
    std::cout << "common functionality" << std::endl;
}

struct Bar: Foo
{
    void f() override
    {
        Foo::f(); // call the base pure virtual implementation, common functionality
        std::cout << "derived functionality" << std::endl;
    }
};

int main() 
{
    std::unique_ptr<Foo> upFoo{std::make_unique<Bar>()};
    upFoo->f();
}

另请参阅 Scott Meyers 的 Effective C++ 的第 34 条,以获得对该主题的非常详细的讨论。

【讨论】:

    【解决方案2】:

    一个明显的例子是当你有一个纯虚析构函数时。析构函数虽然是纯的,但在派生类的对象被销毁时仍将被调用。因此,析构函数是 odr-used 并且需要定义。在大多数情况下,您只想明确默认它。它仍将执行析构函数的常规职责,调用非静态成员的析构函数和进一步的基类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 2012-10-06
      • 2011-12-25
      • 2013-07-03
      相关资源
      最近更新 更多