我正在阅读Never Call Virtual Functions during Construction or Destruction作者:Scott Meyer,关于 C++ 的基本用法。
我想知道 g++ 是否有一些编译器标志来警告这种真正有效的错误编码。如果不是,可能有什么方法可以编写代码来进行此检查?
如果我要编写此类检查的代码,我将通过使用堆栈并在每次调用时插入一条信息来完成这项工作(一种实现调用堆栈的方法。
我仍然需要一种方法来测试函数是否为虚拟函数或函数是否为构造函数:您知道有什么办法可以做到这一点吗?类似于 .NET“反射”想法的东西吗?
最佳答案
> cat nevercall.cpp
class Transaction {
public:
Transaction();
virtual void logTransaction() const = 0;
// ...
};
Transaction::Transaction()
{
//...
logTransaction();
}
class BuyTransaction: public Transaction {
public:
virtual void logTransaction() const;
//...
};
class SellTransaction: public Transaction {
public:
virtual void logTransaction() const;
// ...
};
int main()
{
BuyTransaction b;
}
当(且仅当)virtual void Transaction::logTransaction() const
是pure时,使用-Weffc++
会发出警告,因为它在 Meyer 的示例代码中:
> g++ -Weffc++ nevercall.cpp -o nevercall
nevercall.cpp:1:7: warning: 'class Transaction' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
nevercall.cpp: In constructor 'Transaction::Transaction()':
nevercall.cpp:12:20: warning: pure virtual 'virtual void Transaction::logTransaction() const' called from constructor [enabled by default]
nevercall.cpp: At global scope:
nevercall.cpp:15:7: warning: 'class BuyTransaction' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
nevercall.cpp:22:7: warning: 'class SellTransaction' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
关于c++ - 测试函数是虚函数还是构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10782878/