我正在阅读Scott Meyer关于基本C ++用法的Never Call Virtual Functions during Construction or Destruction。
我想知道g ++是否有一些编译器标志来警告这个真正有效的错误编码。如果没有什么可以成为这种检查的代码方式?
如果我要编写这样的检查,我会通过使用堆栈并在每次调用时插入一条信息来实现这项工作(实现调用堆栈的方式。
我还需要一种方法来测试一个函数是虚函数还是一个函数是一个构造函数:无论如何,你知道吗?类似于.NET'反思'的想法?
答案 0 :(得分:2)
> 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;
}
使用-Weffc++
警告,如果(且仅当)virtual void Transaction::logTransaction() const
纯,就像在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]
答案 1 :(得分:2)
PC-Lint会做到的!
我在这个测试程序上运行它:
#include <stdio.h>
class Base
{
public:
Base() { moo(); }
virtual ~Base() { ; }
virtual void moo(void) { printf("Base::moo\n"); }
};
class Derived : public Base
{
public:
Derived() { ; }
virtual void moo(void) { printf("Derived::moo\n"); }
};
int main(void)
{
Derived j; // Outputs 'Base::moo'
}
它抱怨道:
警告1506:在构造函数或析构函数中调用虚函数'Base :: moo(void)'