我正在阅读关于c ++构造函数的this文章
我们建议您在调用虚拟功能时要小心 构造函数。因为始终调用基类构造函数 在派生类构造函数之前,调用的函数 基础构造函数是基类版本,而不是派生类 版。在以下示例中,构造DerivedClass会导致 print_it()的BaseClass实现在之前执行 DerivedClass构造函数导致DerivedClass实现 print_it()执行:
示例:
class BaseClass {
public:
BaseClass() {
print_it();
}
virtual void print_it() {
cout << "BaseClass print_it" << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() {
print_it();
}
virtual void print_it() {
cout << "Derived Class print_it" << endl;
}
};
int main() {
DerivedClass dc;
}
这是输出:
BaseClass print_it
Derived Class print_it
I tried this code and the output is as stated above。 但是我也尝试了没有虚拟关键字的相同示例:
class BaseClass {
public:
BaseClass() {
print_it();
}
void print_it() {
cout << "BaseClass print_it" << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() {
print_it();
}
void print_it() {
cout << "Derived Class print_it" << endl;
}
};
int main() {
DerivedClass dc;
}
那么它们有什么不同以及它们警告的危险是什么?
@marked as duplicate:
这个问题是不同的,因为consturctors都调用虚方法而不是一个调用虚方法的构造函数。
答案 0 :(得分:7)
没有区别。 那是危险。
如果你不知道更好,那么你可能会想到这一点:
Derived Class print_it
Derived Class print_it
期望存在,因为如果您从virtual
中的函数调用print_it()
Base
,则多态意味着您通常会获得Derived
版本。< / p>
但是,当你在Base
构造函数中编写它时,对象的Base
部分仍在构建中,并且&#34;动态类型&#34;正在构建的对象仍然是Base
,而不是Derived
。所以你没有得到通常的多态行为。
文章警告你这个事实。