参考 effective c++
假设我们写个模拟股市交易的类
这个类每创建一个对象 都必须写一个log
我们实现了个抽象类 因为不同的交易信息不同的log
class Transaction
{
public:
Transaction()
{
log();
}
virtual void log()const = 0;
};
class BuyTransaction :public Transaction
{
public:
virtual void log()const;
};
当我们执行
BuyTransaction buy;
会出现什么问题?
首先 编译器知道这样很危险 编译器是编译不过的 因为我们的 virtual 没有实现 所以在构造里不能调用
但是我们可以在上面封一层这样编译器就检测不出来了,比如下面
class Transaction
{
public:
Transaction()
{
init();
};
void init()
{
log();
}
virtual void log()const = 0;
};
class BuyTransaction :public Transaction
{
public:
virtual void log() const {};
};
加个init 函数 里面调用 log 虚函数 构造时调用 init 函数
这样执行会怎么样呢?
首先会调用父类的构造 然后 就会调用父类的log 这里就会出问题了!
这是调用的是父类的 log 还是 子类的log 函数呢?
虽然我们声明的是子类的对象 但是还是调用的父类的log 这里就很危险了
可能让你通宵调试
直接就崩溃了 还要感谢编译器
你声明一个子类对象 如果正常的运行 可能让你通宵调试 哈哈哈
记住:
千万不要在构造或者析构中调用 virtual函数 , 因为他不会从父类的这层虚函数下降至子类的虚函数