0

我有一个有 5 个子类的基类。

如果在我的基类中我有这个:

virtual CpuPort &getsecondDataPort()=0;

那么这意味着必须为所有子类实现该方法,对吗?

但我不希望这样,因为我知道只有当我有特定子类的对象时我才会调用该方法,所以我认为我可以写这个:

virtual CpuPort &getsecondDataPort();

并仅在我想要的子类中实现它。但这给了我这个错误:

/base.cc:254: undefined reference to `vtable for BaseCPU'

并在其他子类中:

undefined reference to `typeinfo for BaseCPU'

其中 BaseCPU 是我的基类对象。

因为它是一个更大的库(实际上是模拟器)的一部分,所以我想尽可能少地进行更改。所以请不要建议像“只在你的子类中定义”这样的东西,因为我想遵循到目前为止的代码组织方式,除非这是解决问题的唯一方法。

知道为什么会发生这种情况吗?

谢谢

4

3 回答 3

3

这意味着必须为所有子类实现该方法,对吗?

仅当您想创建这些子类的直接实例时。如果子类没有实现纯虚函数,它将是抽象的——这本身是允许的。

但这给了我这个错误:

这是因为虚函数已声明,但未定义。如果函数不是纯虚函数,则必须提供定义。

在这种情况下,您不能提供什么都不做的虚拟实现,因为您的函数应该返回一个引用,并且在不返回任何内容的情况下从一个值返回函数的末尾流出是未定义的行为(第 6.6.3/2 段) C++11 标准。

另一方面,如果你的基类有一个类型CpuPort为 (say)的数据成员,你可以这样做:myCpuPort

virtual CpuPort &getsecondDataPort() { return myCpuPort; }
于 2013-04-20T13:23:03.830 回答
1

似乎唯一的解决方案是在基类中提供一个空实现(考虑到您的限制)。

考虑以下场景:

 struct Base
 {
    virtual void foo() = 0;
 };
 struct Derived1
 {
 };
 struct Derived2
 {
    virtual void foo() {};
 };

 Base* p1 = new Derived1;
 Base* p2 = new Derived2;
 p1->foo();
 p2->foo();

假设编译器让这段代码通过(它没有,这很好)。第二次通话会发生什么?

于 2013-04-20T13:21:02.947 回答
1

您已声明成员函数但未定义它。您需要提供getsecondDataPort.

CpuPort& BaseCPU::getsecondDataPort()
{
     return somevar_;
}
于 2013-04-20T13:22:44.100 回答