【问题标题】:Why doesn't g++ complain when derived class calls pure virtual function of base?为什么派生类调用基类的纯虚函数时g ++不抱怨?
【发布时间】:2012-09-19 13:17:04
【问题描述】:

我有一个带有纯虚函数f() 的类Base。另一个类Derived 派生自Base。我从Derived 中调用f()。并且使用 g++,我从链接器中得到一个错误。

[agnel@dooku tmp]$ g++ pure_virtual_function_call.cpp 
/tmp/ccGQLHi4.o: In function `Derived::f()':
pure_virtual_function_call.cpp:(.text._ZN7Derived1fEv[_ZN7Derived1fEv]+0x14): undefined reference to `VirtualBase::f()'
collect2: error: ld returned 1 exit status

在我看来,错误是被链接器捕获的。为什么编译器没有报告这个错误?为什么要把它留给链接器?

代码如下:

#include <iostream>

using namespace std;

class VirtualBase {
public:
    virtual void f() = 0;
};

class Derived : public VirtualBase {
public:
    void f(){
        VirtualBase::f();
        cout << "Derived\n" ;
    }
};


int main(){
    Derived d;
    d.f();
    return 0;
}

【问题讨论】:

  • 能否请您显示源代码?这样会更容易理解。
  • 请显示您的示例代码。没有这个,就很难回答了。

标签: c++ linker g++ ld pure-virtual


【解决方案1】:

因为纯虚函数可以有定义,如果有定义,您可以使用语法VirtualBase::f() 以非虚方式调用它们。

编译器无法判断你是否要定义函数,因此只能由链接器检测到错误。

【讨论】:

  • 纯虚拟何时可以有定义的例子?
  • @AgnelKurian:你是什么意思?任何纯虚函数都可以有定义。
  • 不知道纯虚函数可以有定义。谢谢。
【解决方案2】:

调用纯虚函数不会出错。调用任何没有定义的函数都是错误的。纯虚函数可以有定义。

【讨论】:

  • 纯虚拟何时可以有定义的例子?
  • @AgnelKurian 随时。 class C { virtual void f() = 0; }; void C::f() { }
  • 你应该补充一下,只有不允许虚拟通话
  • 他调用由类名限定的函数的方式,它是一个虚函数并不重要,因为他是直接调用它,绕过了虚函数机制。
  • @Lol4t0 - 不,始终允许虚拟通话。这是最常见的用法。虚拟调用不会命中纯虚拟的定义,除非有时来自构造函数或析构函数。
猜你喜欢
  • 2021-12-22
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多