此代码的输出产生“BASE!”。为什么在此示例中未调用派生类的复制功能。它们具有相同的签名,根据我的推理,应该调用派生的签名。有什么问题?
#include <iostream>
using namespace std;
class Base{
virtual void copy(const Base&b){
cout<<"BASE!";
}
public:
Base()=default;
Base(const Base&b){
copy(b);
}
};
class Derived: public Base{
void copy(const Base&b) override{
cout<<"DERIVED";
}
};
int main() {
Derived d;
Derived b(d);
return 0;
}
答案 0 :(得分:4)
它没有被调用,因为它还没有存在。
首先构造基类。它的copy-constructor调用虚方法。在首先构造基类之前,派生类不会被构造,因此基类中的虚拟类方法不会被任何东西覆盖。
只有在派生类构造开始时,虚拟类方法才会被派生类覆盖。
派生类实例在实际构造之前根本不存在,并且在基类完全构造之前它不构造,因此在基类构造期间虚拟方法不是被任何事情所覆盖。