2

我正在阅读Scott Meyer 的Never Call Virtual Functions during Construction or Destruction关于基本 C++ 用法的文章。

我想知道 g++ 是否有一些编译器标志来警告这种真正有效的错误编码。如果不是,有什么方法可以编写代码来执行此检查?

如果我要编写这样的检查代码,我会通过使用堆栈并在每次调用时插入一条信息来完成这项工作(一种实现调用堆栈的方法。

我仍然需要一种方法来测试一个函数是虚函数还是构造函数:你知道有没有办法做到这一点?类似于.NET“反思”的想法?

4

2 回答 2

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;
}

当(且仅当)是pure时使用-Weffc++警告,就像在 Meyer 的示例代码中一样:virtual void Transaction::logTransaction() const

> 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]
于 2012-05-28T11:21:21.233 回答
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)”

于 2012-05-28T23:32:21.117 回答