我正在阅读这关于c++构造函数的文章
我们建议您在调用构造函数中的虚拟函数时要小心。因为基类构造函数总是在派生类构造函数之前调用,所以在基构造函数中调用的函数是基类版本,而不是派生类版本。在下面的示例中,构造DerivedClass使print_it()的BaseClass实现在DerivedClass构造函数导致print_it()的DerivedClass实现执行之前执行:
例子:
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我尝试了这段代码,输出如下所示。但是,我也尝试了相同的示例,没有使用虚拟关键字:
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;
}得到了同样的结果。
那么,这两者之间有什么区别,它们所警告的危险是什么?
@标记为重复:
这个问题是不同的,因为构造器都调用了虚拟方法,而不是一个调用虚拟方法的构造函数。
发布于 2016-07-29 19:05:02
没有什么不同。这就是危险所在。
如果您不太了解,那么您可能会期望这样做:
Derived Class print_it
Derived Class print_it这种期望是存在的,因为如果您从virtual print_it()中调用Base函数,那么多态意味着您通常会得到Derived版本。
但是,当您在Base构造函数中编写它时,对象的Base部分仍在构造中,正在构建的对象的“动态类型”仍然是Base,而不是Derived。所以你不能得到通常的多态行为。
这篇文章警告你这个事实。
https://stackoverflow.com/questions/38665566
复制相似问题