【发布时间】:2014-06-02 21:59:41
【问题描述】:
我对“多重继承问题”有点困惑。考虑以下代码块:
#include <iostream>
struct iface
{
virtual void foo () = 0;
virtual ~iface () {}
};
struct wrapped
{
virtual void foo ()
{
std::cerr << "wrapped\n";
}
};
struct impl : public wrapped, public iface
{
};
iface* factory ()
{
return new impl;
}
int main ()
{
iface *object = factory ();
object->foo();
delete object;
return 0;
}
这是从一些使用 pimpl 习惯用法的代码中抽象出来的。这个想法是wrapped 是一个复杂的类,有各种各样的花里胡哨。 iface 只是使wrapped 的一个特定方面可见,factory() 函数通过使用wrapped 构建一个实现iface 的impl 类。在我的真实代码中,wrapped 类来自一个具有巨大标题树的库,因此我在一个单独的编译单元中定义了impl,以避免我的应用程序的其余部分不得不将它们拉入。
反正我贴的东西编译不通过,报如下错误:
$ g++ -o test test.cc
test.cc: In function ‘iface* factory()’:
test.cc:23:16: error: cannot allocate an object of abstract type ‘impl’
return new impl;
^
test.cc:17:8: note: because the following virtual functions are pure within ‘impl’:
struct impl : public wrapped, public iface
^
test.cc:5:18: note: virtual void iface::foo()
virtual void foo () = 0;
^
显然,我可以通过在impl 中编写foo 的具体实现来避免该错误,该实现转发到wrapped::foo(),但我不明白为什么编译器不从@987654335 中获取实现@类。
我假设 iface 中的“foo”和 wrapped 中的“foo”在为 impl 进行名称解析时最终会有所不同(这是正确的词),但我真的不明白为什么。
有人可以解释发生了什么吗?
【问题讨论】:
-
正是 那个 正在发生:wrapped::foo() 不会神奇地映射到 iface::foo()。它们是两种截然不同的类型。当用作“iface”时,编译器必须能够解析 iface::foo(),它不能只是猜测继承的 Wrapped::foo() 是要调用的,你必须给出一个实施。
-
是的,这是有道理的。我想问题是
impl是iface和wrapped的“下游”,因此无法说服他们两个他们的foo函数应该具有相同的解析名称(如果这是正确的术语)。感谢您的帮助。
标签: c++ multiple-inheritance pure-virtual