【发布时间】:2012-07-12 03:44:12
【问题描述】:
我和一个朋友就对象的构造进行了一次非常有趣的讨论,最终得到了这段代码:
#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( ) 的引用未定义。
所以,我的问题是:为什么这是一个链接器错误?如果这是一个错误,我希望编译器会抱怨,特别是因为有一个函数的实现。 对链接器在这种情况下如何工作的任何见解或对进一步阅读的参考将不胜感激。
提前感谢您!我希望这个问题不是重复的,但我找不到类似的问题..
【问题讨论】:
-
你没有在基类中实现函数,你只是尝试调用它。