我正在编写一个类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;
}
答案 0 :(得分:6)
您未加入const
。这会更改函数的签名,最终会将其隐藏在基类中而不是覆盖它。出于这个原因,在覆盖函数时附加override
是一个好主意,因为当它不覆盖任何东西时你会得到一个编译器错误(不过只有那个上的C ++ 11)。将其更改为:
virtual void visit() const /*override*/ {
//^^optional, especially with the override