我和一个朋友就对象的构造进行了一次非常有趣的讨论,最终得到了这段代码:
#include <iostream>
class Parent {
public:
Parent( ) {
this->doSomething( );
}
virtual void doSomething( ) = 0;
};
class Child : public Parent {
int param;
public:
Child( ) {
param = 1000;
}
virtual void doSomething( ) {
std::cout << "doSomething( " << param << " )" << std::endl;
}
};
int main( void ) {
Child c;
return 0;
}
我知道标准没有定义从构造函数或析构函数调用纯虚函数时的行为,这也不是我如何在生产中编写代码的实际示例,它只是检查编译器做什么的测试.
在 Java 打印中测试相同的构造
做某事(0)
这是有道理的,因为从父构造函数调用时param
未初始化。doSomething()
我希望在 C++ 中有类似的行为,不同之处在于param
在调用函数时包含任何内容。
相反,编译上述代码会导致链接器错误,(c++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3)
并指出对的引用Parent::doSomething( )
未定义。
所以,我的问题是:为什么这是一个链接器错误?如果这是一个错误,我希望编译器会抱怨,特别是因为有该函数的实现。任何有关链接器在这种情况下如何工作的见解或对进一步阅读的参考都将受到高度赞赏。
先感谢您!我希望这个问题不是重复的,但我找不到类似的问题..