1

我正在编写一个类,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;
}
4

1 回答 1

6

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

virtual void visit() const /*override*/ {
//^^optional, especially with the override
于 2013-05-23T04:24:29.067 回答