引用虚函数
reference to virtual function
假设我有一个基类a和派生类B和C。我希望能够通过a类型的引用指针执行派生函数的方法。我试过使用虚函数:
class A
{
public:
virtual std::string a() { return "a() of a"; }
virtual std::string b();
virtual std::string c();
};
class B : public A
{
public:
std::string a() { return "a() of b"; }
std::string b() { return "b() of b"; }
};
class C : public A
{
public:
std::string a() { return "a() of c"; }
std::string c() { return "c() of c"; }
};
int main(int argc, char** argv)
{
B b;
C c;
A* a1 = &b;
A* a2 = &c;
std::cout << a1->b() << std::endl;
std::cout << a2->c() << std::endl;
return 0;
}
但是我一直收到这个:
/tmp/ccsCMwc6.o:(.rodata._ZTV1C[_ZTV1C]+0x18): undefined reference to
对A::b()' /tmp/ccsCMwc6.o:(.rodata._ZTV1B[_ZTV1B]+0x20): undefined reference to
答::c ()/tmp/ccsCMwc6.o: (.rodata._ZTI1C [_ZTI1C] + 0 x10):A'typeinfo for A' /tmp/ccsCMwc6.o:(.rodata._ZTI1B[_ZTI1B]+0x10): undefined reference to
typeinfo的未定义引用
帮助吗?
编译器将为每个类生成一个虚函数表(vtbl),它指向该类的所有虚函数的实现,对于类a,它期望找到a::b()和a::c()的实现。
如果你不想实现它们,你需要将它们声明为纯虚的:
class A
{
public:
virtual std::string a() { return "a() of a"; }
virtual std::string b() = 0;
virtual std::string c() = 0;
};
所有虚函数都需要有定义(实现)。
我看还行。如果只实例化继承的类,则不需要在基类中定义。
是什么编译器?
相关文章:
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 类 Referention 中C++回调函数引用非静态函数
- 使用函数引用指向节点的指针删除链表中的节点?
- 解释通过从函数引用返回数组的语法
- "Class1"类"Class2"对象作为私有数据成员。如何通过"Class 2"函数引用"Class1"对象?
- 使用默认构造函数引用成员变量初始化错误
- 无法调用函数引用 c++
- 使用 decltype(this) 获取函数引用
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 从内联函数引用文件静态变量
- Boost::将sigaction函数引用绑定到实例
- 一种比函数引用更有效的方法
- 奇怪的未定义函数引用,函数调用C++不存在
- 是否可以检测绑定成员函数引用的对象是否被删除或销毁
- 构造函数引用参数导致seg错误
- 是否可以使函数模板从函数引用中获取“decltype”
- 无法让 Lua 函数引用"self"
- 如何解析变量和函数引用(Linker & Compiler)?
- 从不同模块调用函数 - 引用错误
- 如何在主函数中连接到数据库,然后从其他函数引用它