我正在阅读谷歌C++风格指南,并在"在构造函数中的工作"部分感到困惑.在构造函数中做繁重工作的缺点之一是:
如果工作调用虚函数,则不会将这些调用分派给子类实现.即使你的类目前没有被子类化,你的类的未来修改也可以悄悄地引入这个问题,造成很多混乱.
我不明白这意味着什么.有人可以提供解释,为什么这可能被认为是一个缺点?
我公然从维基百科虚拟功能页面中删除一些示例代码:
#include <iostream>
#include <vector>
class Animal {
public:
virtual void eat() const {
std::cout << "I eat like a generic Animal." << std::endl;
}
virtual ~Animal() {
}
};
class Wolf : public Animal {
public:
void eat() const {
std::cout << "I eat like a wolf!" << std::endl;
}
};
class Fish : public Animal {
public:
void eat() const {
std::cout << "I eat like a fish!" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
如果eat()在Animal构造函数内部调用,它将Animal eat()每次调用该函数.即使在创建一个Wolf或一个Fish对象时,由于Animal构造函数将在初始化子类对象之前完成,因此覆盖eat函数尚不存在.
这是一个缺点,因为它可能导致预期和实际发生之间的混淆.如果我覆盖eat然后创建我的子类的对象,我希望调用我的重写函数,即使从Animal引用.我期待它,因为当构造函数之外的代码显式调用时会发生这种情况.构造函数中的行为是不同的,导致我在困惑中挠头.