面试题答案
一键面试1. 多重定义问题
- 产生原因:在不同编译单元中,虚基类的成员函数可能被重复定义。这是因为虚基类的特性使得编译器需要在不同地方生成相关代码,不同编译器处理方式有差异,导致链接器看到多个相同符号定义。
- 解决方案:将虚基类的实现放在一个单独的源文件中,确保只有一份定义。同时,在头文件中仅保留声明。例如,头文件中声明虚基类成员函数
virtual void func();
,在源文件中实现void Base::func() { /* 具体实现 */ }
。
2. 符号解析失败
- 产生原因:不同平台或编译器对符号命名规则不同,导致链接器找不到正确的符号。例如,Windows平台和Linux平台对符号的修饰规则差异较大,可能使链接器在搜索库时无法匹配到对应的函数实现。
- 解决方案:使用
extern "C"
进行链接指示,以指定使用C语言的链接约定,避免C++符号修饰带来的问题。同时,在跨平台开发中,尽量统一函数命名规范,并确保库文件在不同平台上的正确配置。 例如,extern "C" { void myFunction(); }
。