虚拟方法未调用

时间:2013-05-23 04:22:26

标签: c++ googletest

我正在编写一个类BTree,用C ++实现二叉树,我正在使用Google Test来测试它。我已经为基类创建了一个虚方法visit(),它在每次调用时打印出当前节点的数据。

通过视觉检查我可以看到数字以正确的顺序输出。但是,我希望能够使用Google Test自动测试。为了做到这一点,我创建了一个子类InOrderTest,它覆盖了visit()方法,以便它附加到字符串而不是打印出来。但是,正在调用基类版本而不是子类。我做错了什么?

这是测试用例:

TEST_F(BTreeTestSuite, inOrder)
{
    class InOrderTest : public BTree
    {
    public:
        InOrderTest(int data) throw(int) : BTree(data), itsVisitString() {};
        std::string visitString(void) const { return itsVisitString; }
        virtual void visit()
        {
            std::ostringstream oss;
            oss << itsData;
            itsVisitString += oss.str();
            std::cerr << "vs1: " << itsVisitString << '|' << std::endl;
            itsVisitString += " ";
            std::cerr << "vs2: " << itsVisitString << '|' << std::endl;
        }
    private:
        std::string itsVisitString;
    };
    InOrderTest iot(20);
    iot.insert(30);
    iot.insert(15);
    iot.insert(10);
    iot.inOrder();
    EXPECT_STREQ("10 15 20 30 ", iot.visitString().c_str());
}

这是基类的(希望)相关部分:

class BTree
{
public:
    BTree(int data) throw();    // constructor(s)
    ~BTree() throw();       // destructor

    void insert(int data);
    unsigned count() const;
    void inOrder() const;

    int   data() const throw() { return itsData; };
    BTree *left() const throw() { return itsLeft; };
    BTree *right() const throw() { return itsRight; };
protected:
    virtual void visit() const;
    int itsData;
private:
    // Don't allow creation of BTree without data
    BTree() throw();    // constructor(s)
    BTree   *itsLeft;
    BTree   *itsRight;
protected:
};
...
void BTree::inOrder() const
{
    if (itsLeft) itsLeft->inOrder();
    visit();
    if (itsRight) itsRight->inOrder();
}

void BTree::visit() const
{
    cout << itsData << endl;
}

1 个答案:

答案 0 :(得分:6)

您未加入const。这会更改函数的签名,最终会将其隐藏在基类中而不是覆盖它。出于这个原因,在覆盖函数时附加override是一个好主意,因为当它不覆盖任何东西时你会得到一个编译器错误(不过只有那个上的C ++ 11)。将其更改为:

virtual void visit() const /*override*/ {
//^^optional, especially with the override