我有一个类,它从具有纯虚拟函数的类继承。当缺少未使用的纯虚拟方法的实现时,链接失败
现在我需要添加另一个类,它不需要某种方法。我有一个想法没有实现这个方法,而不是总在下面的例子中抛出一个异常时,调用此方法,如:
#include <iostream>
class ibase {
public:
virtual void foo() = 0;
virtual void boo() = 0;
};
class base1 : public ibase {
public:
virtual void foo(){ std::cout<<"base1::foo"<<std::endl; }
virtual void boo(){ std::cout<<"base1::boo"<<std::endl; }
};
class base2 : public ibase {
public:
virtual void foo() { std::cout<<"base2::foo"<<std::endl; }
virtual void boo();
};
int main()
{
ibase *inst1 = new base1;
ibase *inst2 = new base2;
inst1->foo();
inst1->boo();
inst2->foo();
}
但是,当我尝试使用下一个编译器选项编译:
g++ dfg.cpp -ansi -pedantic -Wall
本实施例中生产下一输出(使用克++ 4.3.0):
/tmp/ccv6VUzm.o: In function `base2::base2()':
dfg.cpp:(.text._ZN5base2C1Ev[base2::base2()]+0x16): undefined reference to `vtable for base2'
collect2: ld returned 1 exit status
有人可以解释为什么在链接失败? boo()方法不被调用。
为什么你不想抛出异常?它是检测它是否被调用的最安全的方法。另外,如果某些子类不需要它,则可能需要修改接口。 – 2011-03-18 12:15:06
@Space_COwbOy我以为如果有人试图使用这种方法,我会得到一个编译器错误(就像你没有定义一个不应该使用的方法的模板专门化一样) – 2011-03-18 12:20:00
纯虚函数的一般思想是**强制**派生类来实现这些功能。现在你宁愿不? :-) – 2011-03-18 17:05:59